Опубликован: 11.05.2007 | Доступ: свободный | Студентов: 1706 / 243 | Оценка: 4.36 / 4.25 | Длительность: 16:06:00
Лекция 7:

Промежуточная среда COM+ и служба Enterprise Services

Метод StreamCrm.ReadFromFile вызывается клиентом, желающим читать из файла, метод StreamCrm.WriteToFile – желающим перезаписать файл.

public MemoryStream ReadFromFile(string fileName)
    {
        return CheckCache(fileName, true).Stream; 
    }
    
    public MemoryStream WriteToFile(String fileName)
    {
        return CheckCache(fileName, false).Stream;                             
    }

Метод StreamCrm.Flush прекращает работу с потоком, открытым для записи и сохраняет сделанные изменения в записи для журнала секретаря, которую возвращает в качестве своего результата.

public object[] Flush(String fileName)
    {
        StreamCache streamCache = CheckCache(fileName, false);
        streamCache.Stream.Close();        
        object[] record = new object[2];
        record[0] = fileName;
        record[1] = streamCache.Stream.ToArray();                
        return record;
    }

Статический метод StreamCrm.CreateClerk создает секретаря для ведения журнала операций над ресурсом. Вызов статического метода не приводит к удаленному вызову и смене контекста.

public static Clerk CreateClerk()
    {
        return new Clerk(typeof(StreamCompensator), "Compensator",  
                            CompensatorOptions.AllPhases);
    }    
}

Класс StreamCompensator наследуется от класса Compensator и служит для сохранения результатов транзакции в случае успеха или возврате данных в первоначальное состояние в случае отката транзакции.

public class StreamCompensator :
    System.EnterpriseServices.CompensatingResourceManager.Compensator
{       
    private bool prepared = false;

Методы c суффиксом Prepare вызываются для проверки записей в журнале перед завершением или откатом транзакции. Метод PrepareRecord должен вернуть false, если запись журнала должна быть использована. Поскольку журнал записей не контролирует типы записей, это должен сделать метод PrepareRecord.

public override void BeginPrepare ()
    {
    }   

    public override bool PrepareRecord(LogRecord log)
    {
        prepared = false;
        if (!(log.Record is object[]))
            return true;
        object[] record = log.Record as object[];
        if (record.Length != 2)
             return true;
        if (!(record[0] is string) || !(record[1] is byte[]))
             return true;
        prepared = true;
        return false;
    }

Метод EndPrepare возвращает сохраненный в поле объекта результат проверки записи. Если он возвращает true, то возможно успешное завершение транзакции.

public override bool EndPrepare ()
    {
        return prepared;
    }

Методы c суффиксом Commit вызываются для сохранения результата транзакции. Если метод CommitRecord возвращает истинное значение, то запись можно исключить из журнала операций.

public override void BeginCommit (bool commit)
    {
    }

    public override bool CommitRecord (LogRecord log)
    {
        StreamLog.Save(log); 
        return true;
    }
    
    public override void EndCommit ()
    {
    }

Группа методов с суффиксом Abort служит для возвращения ресурсу первоначального состояния при откате транзакции. Поскольку созданный менеджер ресурсов изменяет состояние файлов меняется только при успешном завершении транзакции, то эти методы не содержат никаких действий.

public override void BeginAbort (bool abort)
    {
    }    
    public override bool AbortRecord (LogRecord log)
    {
        return true;
    }    
    public override void EndAbort ()
    {
    } 
} // StreamCrm