Давайте создадим рабочий процесс, состоящий из действия «Получение» и «Задержки».
Активность приема имеет CanCreateInstance = true
и корреляция запроса (сообщения) также предоставляется.
Рабочий процесс размещен в службе рабочего процесса
и сохраняется в базе данных немедленно на холостом ходу.
WorkflowService service = new WorkflowService
{
Name = "MyWorkflow",
Body = new MyWorkflow(),
Endpoints =
{
new Endpoint
{
ServiceContractName = "IMyWorkflow",
AddressUri = new Uri("http://localhost:1234/MyWorkflow"),
Binding = new BasicHttpBinding()
}
}
};
WorkflowServiceHost host = new WorkflowServiceHost(service);
string conn = "Data Source=...;Initial Catalog=...";
host.DurableInstancingOptions.InstanceStore = new SqlWorkflowInstanceStore(conn);
host.Open();
Теперь я отправляю сообщение в рабочий процесс
и среда выполнения создает первый экземпляр рабочего процесса.
Корреляционный ключ включен в сообщение, конечно.
Рабочий процесс продолжается с задержкой
и сохраняется в базе данных и выгружается.
Давайте предположим, что задержка достаточно велика, и я отправлю следующее сообщение
с точно таким же ключом корреляции. Что просходит?
Оба рабочих процесса никогда не просыпаются от задержки и никогда не завершаются.
Что я не прав?
Почему время выполнения рабочего процесса не защищает меня от этого?
Есть ли способ как спасти оба экземпляра рабочего процесса?
Спасибо за помощь!