Планировщик ATG/менеджер очередей

Планировщик ATG создает запланированное задание и выполняет его. Если задание находится в потоке планировщика, другие задания должны ждать. Что я хочу сделать, так это использовать планировщик ATG для создания задания, передать диспетчеру очередей, чтобы он выполнялся один за другим, не останавливая планировщик все вместе. поэтому я хочу поставить очередь между планировщиком, создающим задание, и планировщиком, выполняющим это же задание. Можно ли это сделать? или есть способ, при котором все мои задания будут использовать один и тот же поток, не являющийся потоком планировщика?


person user3199040    schedule 26.07.2014    source источник


Ответы (2)


Похоже, вы хотите использовать очередь Dynamo Messaging System (она же PatchBay) в сочетании с планировщиком.

Что-то вроде:

  1. Планировщик запускается и использует MessageSource для помещения сообщений jms в очередь для каждого задания. Это гарантирует, что планировщику не нужно «ждать», поскольку он просто создает сообщения jms для каждого задания.
  2. Создайте и настройте компонент ядра JobMessageListener, который реализует событие onMessage, считывает задания из очереди и делегирует работу другой службе. Это гарантирует, что задание запускается автоматически и обрабатывается в том порядке, в котором оно использует очередь jms.
  3. Создайте и настройте компонент ядра, что-то вроде JobProcessorService, который выполняет тяжелую работу и обрабатывает задания.

Вы не указываете версию ATG, однако для ATG 10.2 инструкции по достижению этого можно найти здесь.

person bated    schedule 29.07.2014
comment
Также см. этот ответ, в котором говорится о синхронном и асинхронном обмен сообщениями в ATG. - person bated; 01.08.2014

Вы можете контролировать, выполняется ли задание в своем собственном потоке или в потоке планировщика, если вы планируете задание с помощью планировщика самостоятельно с помощью метода 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
person zmcmahon    schedule 06.08.2014
comment
Проблема с этим подходом заключается в том, что вам придется кодировать его очень тщательно, чтобы гарантировать, что вы не дублируете какую-либо работу между потоками, поскольку тогда вы получите много конфликтов. - person bated; 27.08.2014