【发布时间】:2014-07-26 00:02:31
【问题描述】:
ATG 调度程序创建调度的作业并执行它。如果作业在调度程序的线程中,则其他作业必须等待。我想要做的是使用 ATG 调度程序来创建作业,传递给队列管理器,以便它一个接一个地执行,而不是一起停止调度程序。所以我想在创建作业的调度程序和执行同一作业的调度程序之间放置一个队列。 这可以做到吗?还是有一种方法可以让我的所有作业都使用不是调度程序线程的同一线程?
【问题讨论】:
标签: java atg oracle-commerce
ATG 调度程序创建调度的作业并执行它。如果作业在调度程序的线程中,则其他作业必须等待。我想要做的是使用 ATG 调度程序来创建作业,传递给队列管理器,以便它一个接一个地执行,而不是一起停止调度程序。所以我想在创建作业的调度程序和执行同一作业的调度程序之间放置一个队列。 这可以做到吗?还是有一种方法可以让我的所有作业都使用不是调度程序线程的同一线程?
【问题讨论】:
标签: java atg oracle-commerce
听起来您想将 Dynamo 消息传递系统(又名 PatchBay)队列与调度程序结合使用。
类似的东西:
MessageSource 将 jms 消息放入每个作业的队列中这确保调度程序不必“等待”,因为它只是为每个作业创建 jms 消息。
JobMessageListener,它实现onMessage 事件并从队列中读取作业并将工作委托给另一个服务。 这可确保作业自动启动并按照使用 jms 队列的顺序进行处理。
JobProcessorService 的内容,负责完成繁重的工作并处理工作。您没有提及 ATG 的哪个版本,但是对于 ATG 10.2,可以找到实现此目的的说明here。
【讨论】:
如果您通过schedulder.addScheduledJob(...) 方法自己使用调度程序调度作业,您可以控制作业是在自己的线程中执行还是在调度程序线程中执行。 ScheduledJob 的 threadMethod 属性具有三种可能的设置,在下面的链接中进行了讨论。
ScheduledJob Thread Methods - Documentation Link
基本上,你有:
所以,听起来您想使用 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 或@987654331 的值@ 并因此避免使用上面显示的自定义编码。默认设置为reused。
例如:
# /my/custom/MyScheduledJob
$class=my.custom.MyScheduledJob
$scope=global
threadMethodString=separate
【讨论】: