Здраствуйте,

Как запустить БП процессов по расписанию? Напр, начиная с текущего момента, запускать процесс «ActiveCheck» (название БП) каждые 15 минут в течение часа. Заранее, Спосиба.

С уважением,
Гюнель

Нравится

16 комментариев

Гюнель, посмотрите в сторону методов класса 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") ?

Как вручную запустить БП? В окне "Процессы" мой БП не появился.

"Лариса" написал:
Олейник Дмитрий пишет:

Данный код поместите в рамках элемента "задание-сценарий". Первый запуск осуществите вручную.

в том же процессе, запуск которого настраивается ("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);
}

Дмитрий, я этот код и использовал для написания передачи параметра. Не работает оно. Вообще Джоб не создается если так написать (см мой пример выше)

Показать все комментарии