ATG调度程序/队列管理器

时间:2014-07-26 00:02:32

标签: java atg oracle-commerce

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

2 个答案:

答案 0 :(得分:0)

听起来您想要将Dynamo Messaging System(又名PatchBay)队列与调度程序结合使用。

有些事情:

  1. 调度程序运行并使用MessageSource将jms消息放入队列中为每个作业确保调度程序不必等待"等待"因为它只是为每个作业创建jms消息。
  2. 创建并配置实现JobMessageListener事件的核心组件onMessage,并从队列中读取作业并将工作委托给另一个服务。 这可以确保作业自动启动,并在使用jms队列时按顺序处理。
  3. 创建和配置一个核心组件,类似于JobProcessorService,它可以解决繁重的问题并处理工作。
  4. 您没有提到ATG的哪个版本的ATG,但是可以找到实现此目的的说明here

答案 1 :(得分:0)

如果您使用调度程序通过schedulder.addScheduledJob(...)方法自行安排作业,则可以控制作业是在其自己的线程还是调度程序线程中执行。 threadMethod ScheduledJob属性有三种可能的设置,将在下面的链接中讨论。

ScheduledJob Thread Methods - Documentation Link

基本上,你有:

  • 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);
}

如果您正在创建一个从SchedulableServiceSingletonSchedulableService扩展的作业,那么您可以将组件的threadMethodString属性配置为具有{{1}的值}},schedulerseparate因此避免上面显示的自定义编码。默认情况下,它设置为reused

例如:

reused