Цитата:
Сообщение от
sukhanchik
...
Т.е. WF не задумывался в роли алгоритма поиска потерянных вещей, т.е. ситуация, когда А нашел чего-то, а C и D ещё ищут - неприменима для WF (понятно, что "натянуть" функционал с некоторыми ограничениями можно всегда)
Судя по коду как раз что то такое (А нашел закрываем и Б) хотели делать при параллельных заданиях и не только.
Типичное в коде SysWorkflowWorkItem метод completeWorkItems
X++:
while select forupdate
*
from workItemTable
where
// BP deviation documented
workItemTable.CorrelationId == _correlationId &&
workItemTable.StepId == _stepId
{
if (workItemTable.Status != WorkflowWorkItemStatus::Completed)
{
if (_isClaimed && workItemTable.ActivityId == _claimedActivityId)
{
if (workItemTable.Queue)
{
SysWorkflowWorkItem::completeNotification(workItemTable.CompanyId, workItemTable.NotificationId);
workItemTable.NotificationId = 0;
workItemTable.UserId = _user;
workItemTable.Subject = _subject;
workItemTable.Description = _instructions;
}
workItemTable.IsClaimed = NoYes::Yes;
}
else
{
workItemTable.Status = WorkflowWorkItemStatus::Completed;
SysWorkflowWorkItem::completeNotification(workItemTable.CompanyId, workItemTable.NotificationId);
workItemTable.NotificationId = 0;
}
workItemTable.update();
}
Де факто закрывают часть заданий скопом