Программирование >>  Программирование с использованием ajax 

1 ... 389 390 391 [ 392 ] 393 394 395 396


static void WorkflowLoaded(object sender, WorkflowEventArgs e) {

Console.WriteLine( Workflow {0} Loaded ,

Рабочий поток загружен е.Workflowlnstance.Instanceld);

static void WorkflowUnloaded(object sender, WorkflowEventArgs e) {

Console.WriteLine( Workflow {0} Unloaded , Рабочий поток выгружен е.Workflowlnstance.Instanceld);

static void WorkflowPersisted(object sender, WorkflowEventArgs e) {

Console.WriteLine( Workflow {0} Persisted , Рабочий поток сохранен е.Workflowlnstance.Instanceld);

static void Workflowldled(object sender, WorkflowEventArgs e) {

Console.WriteLine( Workflow {0} Idled ,

Рабочий поток простаивает е.Workflowlnstance.Instanceld);

Каждое из событий предусматривает просто отображение вывода в окне консоли. Если вы теперь запустите приложение, на экране должно появиться следующее сообщение:

Workflow 9223fe0b-5a3f-4e93-a5e0-f5852bllb006 Idled

Здесь виден только уникальный идентификатор экземпляра рабочего потока и название того события, которое произошло. Без службы обеспечения постоянства все, что вы получаете - это лишь уведомление о том, что рабочий поток простаивает. Если же вы теперь добавите код для добавления службы постоянства в исполняющую среду, вы сможете видеть, как рабочий поток сохраняется и выгружается из памяти, а чуть позже снова загружается и продолжает выполнение.

Добавлять службу в исполняющую среду рабочего потока можно двумя способами - либо с помощью кода, либо с помощью конфигурационного файла. Здесь будут продемонстрированы оба способа, но вообще рекомендуется добавлять все службы в исполняющую среду с применением второго подхода, т.е. с помощью конфигурационного файла. Такой подход упрощает внесение изменений в службы в будущем, поскольку не требует компилировать приложение заново.

У SqlWorkf lowPersistenceService имеется несколько конструкторов, но наиболее полезный из них принимает четыре параметра: строку подключения, булевское значение, указывающее на то, должна ли служба выгружать простаивающие экземпляры, и два значения, представляющих временные интервалы- instanceOwnershipDuration и loadinglnterval. Значением параметра unloadOnldle обычно должно быть true; он отвечает за то, будут ли простаивающие рабочие потоки выгружаться из памяти, и доступен для настройки только в случае использования такого принимающего четыре параметра конструктора. При установке для него значения false (которое является значением по умолчанию) рабочие потоки будут сохраняться лишь в случае их завершения или в случае специального запрашивания действие]у1 точки постоянного хранения.



Параметр instanceOwnershipDuration применяется для указания того, насколько долго рабочему потоку разрешено выполняться в среде с несколькими машинами. При наличии нескольких машин, отвечающих за обработку рабочих потоков, необходимо обязательно задавать это значение для обеспечения возможности выявления сбоев в процессе обработки рабочего потока тем или иным узлом. Когда машина выбирает пригодный для обработки по расписанию рабочий поток из базы данных, он помечается как заблокированный на указанный период. Если по истечении этого периода времени данный рабочий поток так и не сохраняется снова, тогда какой-то другой узел может разблокировать его и обработать. Что касается параметра loadinglnterval, то он позволяет указывать, насколько часто служба обеспечения постоянства должна опрашивать базу данных в поисках рабочих потоков с истекшими таймерами (т.е. готовыми к выполнению). По умолчанию для параметра instanceOwnershipDuration устанавливается значение TimeSpan. MaxValue, а для параметра loadlnterval - две минуты.

7. Теперь добавьте в приложение приведенный ниже код для добавления в исполняющую среду рабочего потока службы обеспечения постоянства. Строка подключения к базе данных здесь жестко кодируется, хотя лучше определять все это поведение внутри конфигурационного файла для упрощения внесения изменений в будущем: static void Main(string[] args) {

using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) {

string conn = @ Data Source=.\sqlexpress;Initial Catalog=WF;

Integrated Security=True ; workflowRuntime.AddService(new SqlWorkflowPersistenceService

(conn, true, TimeSpan.FromMinutes (2), TimeSpan.FromSeconds(30)));

Здесь вы создали SqlWorkf lowPersistenceService и указали строку подключения, значение true для параметра unloadOnldle, две минуты для параметра длительности владения экземпляром (instanceOwnershipDuration) и 30 сеьсунд для параметра интервала загрузки (loadinglnterval).

8. Чтобы определить точно такое же поведение с помощью конфигурационного файла, добавьте в решение сначала ссылку на сборку System. Conf iguration, а затем - конфигурационный файл приложения, как показано ниже:

<?xml version= 1.0 encoding= utf-8 ?> <configuration>

<configSections> <section name= WF

type= System.Workflow.Runtime.Configuration.WorkflowRuntimeSection. System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 /> </configSections>

<WF>

<CommonParameters> <add name= ConnectionString

value= Initial Catalog=WF;Data Source=.\sqlexpress; Integrated Security=SSPI; /> </CommonParameters >



<Services>

<add type= System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 UnloadOnIdle= true />

</Services> </WF>

</configuration>

Этот файл включает определение для обработчика раздела конфигурации Workf lowRuntimeSection, который применяется для считывания раздела по имени WF. В разделе WF вы сначала определми ConnectionString как совместно используемый параметр, а затем определили службу постоянства внутри раздела Services путем добавления класса SqlWorkf lowPersistenceService и указания значения true для его атрибута UnloadOnldle.

9. Чтобы заставить исполняющую среду рабочего потока считывать данные из этого раздела конфигурации, в код приложения необходимо внести одно небольшое изменение:

static void Main(string [ ] args) {

Считывать раздел config для конфигурирования служб

using (WorkflowRuntime WorkflowRuntime = new WorkflowRuntime( WF ))

После внесения таких изменений запуск приложения приведет к отображению в окне консоли следующего вывода:

Workflow 755348bc-3e86-46c4-99a0-3552a2ba7e6f Idled Workflow 755348bc-3e86-46c4-99a0-3552a2ba7e5f Persisted Workflow 755348bc-3e86-46c4-99a0-3552a2ba7e5f Unloaded Workflow 755348bc-3e86-46c4-99a0-3552a2ba7e5f Loaded Workflow 755348bc-3e86-46c4-99a0-3552a2ba7e5f Persisted

Первое сообщение показывает, что выполняется действие DelayActivity, поскольку именно при выполнении такого действия рабочий поток попадает в состояние простоя. Поскольку сейчас в прможении есть установленная служба обеспечения постоянства с настроенным параметром UnloadOnldle, далее рабочий поток сохраняется (Persisted) и на этом этапе его текущее состояние упаковывается и сохраняется в базе данных. Следующим происходит событие выгрузки (Unload) рабочего потока и на этом этапе рабочий поток больше не находится в памяти, а существует исключительно на диске внутри базы данных. Еще оно приводит к добавлению в базу данных записи, определяющей, должен ли рабочий поток возобновляться снова для продолжения обработки.

Если на этом этапе заглянуть в таблицу InstanceState базы данных, можно увидеть строку, представляющую экземпляр рабочего потока (рис. 36.20).

iMflnsUnceiO

state

status

unlocked

blocked

modified

ownerD

ownedUntri

nextTimef

> 1и34вЬс.ив -4вс4- 10-3552*2Ь 7 51

<B.n* y dete

26Л0 2007 19-47 49

NULL

NULL

2€a02007 1948 49

,NULL

NULL

NULL

NULL

NULL

NULL

NULL

NULL

NULL

NULL

Puc. 36.20. Стракау представляющая экземпляр рабочего потока, в таблице InstanceState



1 ... 389 390 391 [ 392 ] 393 394 395 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика