Java ATG调度程序/队列管理器

Java ATG调度程序/队列管理器,java,atg,oracle-commerce,Java,Atg,Oracle Commerce,ATG调度程序创建并执行计划作业。如果作业在调度程序的线程中,则其他作业必须等待。我想做的是使用ATG调度程序创建作业,传递给队列管理器,以便它一个接一个地执行,而不是同时停止调度程序。所以我想在创建作业的调度器和执行相同作业的调度器之间放置一个队列。 这能做到吗?或者有一种方式,我的所有作业都将使用同一个线程,而不是调度程序的线程?听起来您想将Dynamo消息传递系统(又称PatchBay)队列与调度程序结合使用 大致如下: 调度器运行并使用MessageSource将jms消息放在每个作业的

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

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

大致如下:

  • 调度器运行并使用
    MessageSource
    将jms消息放在每个作业的队列中。这确保调度器不必“等待”,因为它只是为每个作业创建jms消息
  • 创建并配置nucleus组件
    JobMessageListener
    ,该组件实现
    onMessage
    事件,从队列中读取作业,并将工作委托给其他服务。这可以确保作业自动启动,并在使用jms队列时按顺序进行处理
  • 创建并配置一个nucleus组件,类似于
    JobProcessorService
    ,它完成繁重的工作并处理作业

  • 您没有提到ATG的哪个版本,但是对于ATG 10.2,可以找到实现这一点的说明。

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

    基本上,你有:

    • 调度程序线程:作业使用调度程序线程运行
    • 独立线程:调度程序为每个线程的执行创建一个新线程 作业和作业在该线程中运行
    • 重用线程:与分离线程方法相同,不同之处在于同一线程在作业的多个运行中使用
    因此,听起来您可能想使用独立线程重用线程

    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
    ,或
    重复使用
    ,因此避免使用上述自定义编码。默认情况下,它被设置为
    重用

    例如:

    # /my/custom/MyScheduledJob
    $class=my.custom.MyScheduledJob
    $scope=global
    threadMethodString=separate
    

    还请参考这篇文章,它讨论了ATG中的同步与异步消息传递。这种方法的问题是,您必须非常小心地对其进行编码,以确保不会跨线程重复任何工作,因为这样会导致大量争用。