Планировщик ATG создает запланированное задание и выполняет его. Если задание находится в потоке планировщика, другие задания должны ждать. Что я хочу сделать, так это использовать планировщик ATG для создания задания, передать диспетчеру очередей, чтобы он выполнялся один за другим, не останавливая планировщик все вместе. поэтому я хочу поставить очередь между планировщиком, создающим задание, и планировщиком, выполняющим это же задание. Можно ли это сделать? или есть способ, при котором все мои задания будут использовать один и тот же поток, не являющийся потоком планировщика?
Планировщик ATG/менеджер очередей
Ответы (2)
Похоже, вы хотите использовать очередь Dynamo Messaging System (она же PatchBay) в сочетании с планировщиком.
Что-то вроде:
- Планировщик запускается и использует
MessageSource
для помещения сообщений jms в очередь для каждого задания. Это гарантирует, что планировщику не нужно «ждать», поскольку он просто создает сообщения jms для каждого задания. - Создайте и настройте компонент ядра
JobMessageListener
, который реализует событиеonMessage
, считывает задания из очереди и делегирует работу другой службе. Это гарантирует, что задание запускается автоматически и обрабатывается в том порядке, в котором оно использует очередь jms. - Создайте и настройте компонент ядра, что-то вроде
JobProcessorService
, который выполняет тяжелую работу и обрабатывает задания.
Вы не указываете версию ATG, однако для ATG 10.2 инструкции по достижению этого можно найти здесь.
Вы можете контролировать, выполняется ли задание в своем собственном потоке или в потоке планировщика, если вы планируете задание с помощью планировщика самостоятельно с помощью метода schedulder.addScheduledJob(...)
. Свойство threadMethod
элемента ScheduledJob
имеет три возможных параметра, которые обсуждаются по ссылке ниже.
Методы запланированных заданий — ссылка на документацию
По сути, у вас есть:
- SCHEDULER_THREAD: задание выполняется с использованием потока планировщика.
- SEPARATE_THREAD: планировщик создает новый поток для каждого выполнения задания, и задание выполняется в этом потоке.
- REUSED_THREAD: то же, что и SEPERATE_METHOD, за исключением того, что один и тот же поток используется для нескольких запусков задания.
Итак, похоже, вы хотите использовать либо SEPARATE_THREAD, либо REUSED_THREAD.
public void doStartService() throws ServiceException
{
ScheduledJob job = new ScheduledJob("hello",
"Prints Hello",
getAbsoluteName(),
getSchedule(),
this,
ScheduledJob.SEPARATE_THREAD);
jobId = getScheduler().addScheduledJob(job);
}
Если вы создаете задание, которое расширяется либо от SchedulableService
, либо от SingletonSchedulableService
, вы можете настроить свойство threadMethodString
вашего компонента так, чтобы оно имело значение scheduler
, separate
или reused
и, следовательно, избежать пользовательского кодирования, показанного выше. По умолчанию установлено значение reused
.
Например:
# /my/custom/MyScheduledJob
$class=my.custom.MyScheduledJob
$scope=global
threadMethodString=separate