Показать сообщение отдельно
Старый 07.07.2022, 11:00   #11  
axm2017 is offline
axm2017
Участник
 
1,761 / 293 (13) ++++++
Регистрация: 15.05.2017
Цитата:
Сообщение от 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();
            }
Де факто закрывают часть заданий скопом