Запускаю из сервиса БП, в котором нет никаких ожиданий.
UserConnection userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection; var manager = userConnection.ProcessSchemaManager; var processSchema = manager.GetInstanceByName("UsrProcess"); var process = processSchema.CreateProcess(userConnection); process.SetPropertyValue("ExternalCall", true); process.Execute(userConnection);
Подскажите, как дождаться завершения БП и прочитать параметры, которые мы имеем в конце выполнения?
Нравится
Добрый день!
Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.
Забирать их следующим образом (пример):
res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false; res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";
Добрый день!
Данное действие синхронно, т.е. после завершения операции process.Execute(userConnection); уже можно забирать параметры.
Забирать их следующим образом (пример):
res.Success = process.GetPropertyValue("RpSuccess") != null ? (bool)process.GetPropertyValue("RpSuccess") : false; res.ErrorDescription = process.GetPropertyValue("RpReturnMsg") != null ? (string)process.GetPropertyValue("RpReturnMsg") : "";
Я бы еще добавил проверку что БП завершен а не свалилися например с ошибкой или еще выполняется, примерно так.
if (process.Status != ProcessStatus.Running && process.Status != ProcessStatus.Error)
or
if (process.Status == Terrasoft.Core.Process.ProcessStatus.Done)
Как выяснилось, мне нужен интерпретируемый процесс, а там все немного по-другому, а именно
UserConnection userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection; var manager = userConnection.ProcessSchemaManager; var processSchema = manager.GetInstanceByName("UsrPreCreateDealProcess"); var flowEngine = new Terrasoft.Core.Process.FlowEngine(userConnection); Dictionary<string, object> parameter = new Dictionary<string, object>(); parameter.Add("CarId", car_id); Terrasoft.Core.Process.ProcessDescriptor pd = flowEngine.RunProcess(processSchema, parameter); if (pd.ProcessStatus == Terrasoft.Core.Process.ProcessStatus.Done) { ????? }
Как вытащить параметры в конце выполнения здесь?
Есть предположение, что копать стоит в сторону FlowEngineStateService, у него есть метод FindProcessComponentSet(Guid processUId), который возвращает инфу о процессе. И там уже забрать параметры
Сидоров Александр В.,
я нашел этот класс, у него есть метод GetParameterValue, но он стабильно возвращает, что параметр не найден по данному пути и возникает (философский) вопрос, что есть Путь? Видимо, это не просто имя. Но товарищи из Террасофта не догадались описать этот момент нигде ни разу.
перепробовал всё с FlowEngineStateService - ничего не работает, написал в ТП
Вообще, не очень хорошо запускать процессы и ждать их завершения синхронно. Ведь процесс может выполняться некоторое время или вообще иметь элементы для общения с пользователем. Лучше будет в самом процессе записывать результаты в какую-то таблицу, а потом периодически её новые записи обрабатывать.
ТП ответила, что решения в 7.11 нет. Я так и знал :)) и заранее сделал обходной путь через БД. Заодно полезное для отладки логирование получилось