Итак, у нас есть задача: С заданной периодичностью надо выполнять какие-то действия (изменяющиеся в зависимости от входных данных - настроек). В случае успеха / неуспеха надо информировать об этом пользователя.
Мне кажется, что следующее решение близко к идеальному.
1)Создаём таблицу - настроек. То есть создаём собственно таблицу в бд, на её основе строим БК и на его основе строим аплет, который включаем в представление, которое подключаем к существующему экрану (или создаём свой собственный и делаем доступным из навигатора). Вот как это может выглядеть:
В таблице настроек обязательно следующее:
- Кнопки запуска нашего воркфлова с подачей на вход настройки на котором стоим (а точнее её ай-ди). Чтобы можно было запустить воркфлов и проконтролировать его работу. Для этой же цели используется кнопка "обновить", которая обновляет текущую строку, а точнее "статус последнего выполнения" нашего воркфлова.
- Обязательно должны быть поле "статус последнего выполнения". Куда я предлагаю писать статус с тем расчётом, что если какой-то шаг воркфлова выполнен успешно, то он оставляет свой след в "статусе". Таким образом всегда можно узнать на каком этапе сейчас находится ворклфлов и если он сломался, то на каком (точнее после какого) шага. Вот примеры статуса после успешного выполнения: "WF started.GetParam. CreateList. CreateAndLoadCompany. LauchCompany. Type=CISKO. ZagruzTel. VigruzTel. CheckObjective. sms=NO. End (ok)"
- Другие обязательные поля это "ошибка", куда записывается ошибка воркфлова если он упал (в этом случае поле статус последнего выполнения оборвётся на последнем успешно выполненном шаге). Поле "дата-время" последнего запуска воркфлова. Также желательно иметь список емайл-адрессов и телефонов куда должны приходить письма/смс-ки в случае ошибки и (если установлена требуемая настройка) в случае успеха. Разумеется письма/смс-ки с ошибками должны содержать как минимум значение статуса последнего выполнения, а как максимум ещё и текст ошибки. Также ещё неплохо бы иметь поле "короткий статус последнего выполнения" где бы просто писалось "ок" или "не ок".
Примечание: Помните, что новые представления (View) не видны пользователю пока вы не дадите права на его просмотр. А если на новом экране всего одно новое представление на которое вы ещё пока не раздали права, то весь экран не будет показываться в навигаторе.
(выдержки из серверных скриптом аплета - таблицы настроек. Разумеется это только для тестирования. Во время эксплуатации наш воркфлов будет запускаться через джобы)
Вот код вызова ворклова для русской версии сибеля (приходится создавать однократно выполняемый джоб) и подачи ему на вход ай-ди той строки в таблице настроек на которой мы сейчас стоим:
var svc = TheApplication().GetService("Asynchronous Server Requests")
var input = TheApplication().NewPropertySet();
var child = TheApplication().NewPropertySet();
var output = TheApplication().NewPropertySet();
input.SetProperty("Component", "WfProcMgr");
child.SetProperty("ProcessName", "BigRedButtonWorkFlow");
child.SetProperty("Object Id", this.BusComp().GetFieldValue("Id"));
input.AddChild(child);
svc.InvokeMethod("SubmitRequest", input, output);
child=null;input=null;output=null;
svc=null;
Вот код вызова ворклофва для англ версии
var inpPS1: PropertySet = TheApplication().NewPropertySet();
var outPS1: PropertySet = TheApplication().NewPropertySet();
var iPS1 = TheApplication().NewPropertySet();
var oPS1 = TheApplication().NewPropertySet();
var bs1 = TheApplication().GetService("Workflow Process Manager");
inpPS1.SetProperty("ProcessName", "BigRedButtonWorkFlow");
inpPS1.SetProperty("Object Id", this.BusComp().GetFieldValue("Id"));
bs1.InvokeMethod("RunProcess", inpPS1, outPS1);
И напоследок код позволяющий обновить именно ту строчку на которой мы сейчас стоим
//обновим аплет не теряя контекст выполнения. Взято с
http://barkablog.ru/refreshcurrentapplet_method=525 (рекомендую!)
var iPS2 = TheApplication().NewPropertySet();
var oPS2 = TheApplication().NewPropertySet();
TheApplication().GetService("FINS Teller UI Navigation").InvokeMethod("RefreshCurrentApplet", iPS2,oPS2);
iPS2=null;oPS2=null;
2)Создаём собственно воркфлов
На входе у нас только ай-ди настройки из таблицы настроек. Следовательно наш поток должен вытащить все настройки самостоятельно.
Собственно воркфлов у вас будет свой собственный я только рекомендую следующее.
Завести переменную MyStatus и после каждого успешного действия дописывать к ней метку этого самого действия и (опять же после каждого успешного действия, что может показаться несколько утомительно) сливать содержимое переменной MyStatus в поле "статус последнего выполнения" в таблицу настроек для настройки чьё ай-ди нам подали на вход. Конечно можно только лишь обнулять поле статус в начале потока и заполнять в конце, но вы уверены, что предусмотрели все возможные ошибки? Честно говоря луче лишних десять раз дёрнуть сибель, но в случае ошибки иметь больше информации по ней. Кроме того если вы используете подпотоки и вызываете бизнес сервисы внутри которых опять же стоит собственная обработка ошибок, то в случае падения воркфлова ошибку вы можете не получить. Так хотя бы будете знать шаг где всё поломалось.
Вот как примерно это может выглядеть. При старте воркфлова очищаем поля "статус последнего выполнения" в таблице настроек и пишем в поле "дата последнего запуска" текущие дату-время.
статус обновляем как-то так
А заполняем статус (в выходных параметрах ноды предшествующей обновлению статуса) вот так:
Все ошибки (красные стрелки error-коннекторов) вы сводим в update-ноду. Вот её входные параметры (обратите внимание мы отрезаем лишнее от ошибки)
Впоследствии ветка обработки ошибок отсылает письмо и отсылает смс-сообщение
3)Настраиваем джоб для запуска нашего ворклофва в автоматическом режиме подавая на вход ай-ди соответсвующей настройки