1

ATG 调度程序创建调度的作业并执行它。如果作业在调度程序的线程中,则其他作业必须等待。我想要做的是使用 ATG 调度程序来创建作业,传递给队列管理器,以便它一个接一个地执行,而不是一起停止调度程序。所以我想在创建作业的调度程序和执行同一作业的调度程序之间放置一个队列。这可以做到吗?或者有一种方法可以让我的所有工作都使用不是调度程序线程的同一线程?

4

2 回答 2

0

听起来您想将 Dynamo 消息传递系统(又名 PatchBay)队列与调度程序结合使用。

类似于以下内容:

  1. 调度程序运行并使用 aMessageSource将 jms 消息放在每个作业的队列中这确保调度程序不必“等待”,因为它只是为每个作业创建 jms 消息。
  2. 创建和配置一个核心组件JobMessageListener,该组件实现onMessage事件并从队列中读取作业并将工作委托给另一个服务。 这可确保作业自动启动并按照使用 jms 队列的顺序进行处理。
  3. 创建和配置一个核心组件,JobProcessorService它可以完成繁重的工作并处理工作。

您没有提及 ATG 的哪个版本,但是对于 ATG 10.2,可以在此处找到实现此目的的说明。

于 2014-07-29T15:03:56.437 回答
0

schedulder.addScheduledJob(...)如果您通过该方法自己使用调度程序调度作业,您可以控制作业是在自己的线程中执行还是在调度程序线程中执行。的threadMethod属性ScheduledJob具有三个可能的设置,这些设置在下面的链接中进行了讨论。

ScheduledJob 线程方法 - 文档链接

基本上,你有:

  • SCHEDULER_THREAD:作业使用调度程序线程运行。
  • SEPARATE_THREAD:调度程序为每次执行作业创建一个新线程,并且作业在该线程中运行。
  • REUSED_THREAD:与SEPERATE_METHOD相同,只是在作业的多次运行中使用相同的线程。

所以,听起来你想使用SEPARATE_THREADREUSED_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,因此避免上面显示的自定义编码。默认情况下,它设置为。separatereusedreused

例如:

# /my/custom/MyScheduledJob
$class=my.custom.MyScheduledJob
$scope=global
threadMethodString=separate
于 2014-08-06T16:19:37.277 回答