Здраствуйте,
Как запустить БП процессов по расписанию? Напр, начиная с текущего момента, запускать процесс «ActiveCheck» (название БП) каждые 15 минут в течение часа. Заранее, Спосиба.
С уважением,
Гюнель
Нравится
Гюнель, посмотрите в сторону методов класса AppScheduler. Ознакомится с методами и их параметрами в можно в SDK : http://www.terrasoft.ua/bpmonlinesdk/.
Добавлю, что в SDK в разделе "Статьи" как раз размещена статья "Запуск процессов по расписанию", которая может помочь в решении вашего вопроса.
Здраствуйте,
Она у меня не сработала. Не могли ба подсказать, что я не правильно сделала.
Создала новый БП. На дизайнере процесса добавила следующие настройки:
1. Methods
SheduleMinutelyProcessJob
Сценарий:
int minutleyInterval = 5;
AppScheduler.ScheduleMinutelyProcessJob("Process5",
null, "CurrentSolution", "CurrentUserName", minutleyInterval);
return true;
Тип возвращаемого значения:
bool
2. Usings
Terrasoft.Core.Scheduler
Заранее Спосиба
С уважением,
Гюнель
Здравствуйте.
Начиная с текущего момента, запускать процесс каждые 15 минут в течение часа
// Создаем задание для запуска процесса JobDetail job = AppScheduler.CreateProcessJob("ReadSomeDataProcessJob", null, "ReadSomeDataProcess", "TSBpm", "CurrentUserName"); // Создаем простой триггер, соответствующий графику запуска задания Trigger trigger = new SimpleTrigger("ReadSomeDataProcessTrigger", null, DateTime.UtcNow, DateTime.UtcNow.AddHours(1), SimpleTrigger.RepeatIndefinitely, TimeSpan.FromMinutes(15)); // Добавляем задание и триггер в планировщик AppScheduler.Instance.ScheduleJob(job, trigger);
где, TSBpm - рабочее пространство, в котором запустится БП.
CurrentUserName - имя пользователя, от имени которого запустится БП.
Данный код поместите в рамках элемента "задание-сценарий". Первый запуск осуществите вручную.
Чтобы не плодить темы, спрошу здесь. Почитал описание планировщика.
Хочу уточнить - он может функционировать автономно? То есть на сервере необходимо выполнение неких сценариев в определенные промежутки времени без участия пользователей, открывших интерфейс системы и работающих в ней.
Александр, не тестировал, но если Вы добавите и запустите Job в планировщике, и поставите его выполнение каждый час в течении одного года - то он будет выполнятся, пока живой сервер приложения.
Но я бы посмотрел в сторону Job'ов SQL сервера.
"Александр Кудряшов" написал:Чтобы не плодить темы, спрошу здесь. Почитал описание планировщика.
Хочу уточнить - он может функционировать автономно? То есть на сервере необходимо выполнение неких сценариев в определенные промежутки времени без участия пользователей, открывших интерфейс системы и работающих в ней.
Этот планировщик - часть системы BPMonline. Т.е. он будет работать, пока работает приложение на веб-сервере. Как только приложение свернется по таймауту, например, планировщик тоже "умрет".
При отсутствии в бизнес-процессе элементов, ожидающих реакции от пользователя, все будет работать и без активных пользователей в системе.
"Лариса" написал:
Олейник Дмитрий пишет:
Данный код поместите в рамках элемента "задание-сценарий". Первый запуск осуществите вручную.
в том же процессе, запуск которого настраивается ("ReadSomeDataProcess") ?
Как вручную запустить БП? В окне "Процессы" мой БП не появился.
В данный раздел попадают процессы с тегом "Business Process". Есть такое свойство у процесса в дизайнере процессов (нужно включить отображение всех свойств).
"Олейник Дмитрий" написал:где, TSBpm - рабочее пространство, в котором запустится БП.
Дмитрий, а откуда брать название рабочего пространства? Что это за параметр
"Александр Кудряшов" написал:
Олейник Дмитрий пишет:
где, TSBpm - рабочее пространство, в котором запустится БП.
Дмитрий, а откуда брать название рабочего пространства? Что это за параметр
Это "Конфигурация" на этапе логина в систему.
"Дмитрий Логвиненко" написал:Это "Конфигурация" на этапе логина в систему.
Ага, спасибо, уже разобрался :)
Еще вопрос.
Смотрим СДК
Видим что
public static Quartz.IJobDetail CreateProcessJob( string jobName, string jobGroup, string processName, string workspaceName, string userName, IDictionary<string,object> parameters )
но если попробовать использовать этот метод так
var job = AppScheduler.CreateProcessJob(TitleJob, "DefaultGroup", "SendSMSProcess", "TSBpm", "Supervisor", parameters);
то возникает ошибка по причине наличия 6-го параметра.... действительно, смотрим в ILSpy данный метод (BPM 5.4.0.1351):
CreateProcessJob(string jobName, string jobGroup, string processName, string solutionName, string userName)
Видим что он действительно при вызове не содержит 6-ой параметр и в СДК ошибка.
Теперь интереснее: мне надо создать Job, который в некоторый запланированный момент запустит процесс, и передаст в него параметр Id некоторой записи. Так вот, запустить отсроченно процесс я могу, а параметр передать в него не получается. Параметр мне известен на момент создания Job.
Вопрос такой: как с помощью Job вызвать по расписанию процесс и передать в него параметр?
Уже пробовал сделать вот так:
var parameters = new Dictionary<string, object> { {"ActivityId", ActivityId.ToString()} }; var job = AppScheduler.CreateProcessJob("SomeJob", "DefaultGroup", "SomeProcess", "TSBpm", "Supervisor"); if (parameters != null) { foreach (KeyValuePair<string, object> current in parameters){ job.JobDataMap[current.Key] = current.Value; } } var trigger = new SimpleTrigger("SomeTrigger", null, DateTime.UtcNow.AddHours(1)); AppScheduler.Instance.ScheduleJob(job, trigger);
если закомментировать строку job.JobDataMap[current.Key] = current.Value; то все ок, правда без параметра. Если строку оставить, шедулер вообще не создает Job...
Простите за многобукв:smile:
Почитал очень внимательно статью про запуск процессов.
В СДК не ошибка, а неточность выходит... пометки там не хватает, что параметры поддерживаются начиная с версии 7.0
Так выходит нельзя вообще параметры в вызываемый процесс передать в 5-ке, никак-никак? :smile:
В версии 5.4.х параметры можно передать в немедленно запускаемый бизнес-процесс. Вот код метода, возможно Вас натолкнет на некоторые мысли:
/// <summary>Планирует задачу для немедленного однократного запуска процесса BPMonline</summary> /// <param name="jobName">Название задачи</param> /// <param name="jobGroup">Название группы, к которой относится задача</param> /// <param name="processName">Название процесса</param> /// <param name="solutionName">Solution, в котором следует запустить процесс</param> /// <param name="userName">Пользователь, от имени которого будет запускаться процесс</param> /// <param name="parameters">Параметры, которые будут передаваться в процесс</param> /// <remarks>Если задача с таким именем в данной группе уже существует, она пересоздается заново. Если /// процесс не может быть запущен в текущий момент, он будет запущен как только это станет возможно.</remarks> public static void ScheduleImmediateProcessJob(string jobName, string jobGroup, string processName, string solutionName, string userName, IDictionary<string, object> parameters) { if (string.IsNullOrEmpty(jobName)) { throw new ArgumentNullException("jobName"); } if (string.IsNullOrEmpty(jobGroup)) { throw new ArgumentNullException("jobGroup"); } if (string.IsNullOrEmpty(processName)) { throw new ArgumentNullException("processName"); } if (string.IsNullOrEmpty(solutionName)) { throw new ArgumentNullException("solutionName"); } if (string.IsNullOrEmpty(userName)) { throw new ArgumentNullException("userName"); } RemoveJob(jobName, jobGroup); JobDetail job = CreateProcessJob(jobName, jobGroup, processName, solutionName, userName); Trigger trigger = new SimpleTrigger(jobName + "Trigger", jobGroup, DateTime.UtcNow, null, 0, TimeSpan.Zero); trigger.MisfireInstruction = MisfireInstruction.SimpleTrigger.FireNow; if (parameters != null) { foreach (var parameter in parameters) { job.JobDataMap[parameter.Key] = parameter.Value; } } Instance.ScheduleJob(job, trigger); }
Дмитрий, я этот код и использовал для написания передачи параметра. Не работает оно. Вообще Джоб не создается если так написать (см мой пример выше)