我正在使用Jboss-seam 2.2.2.Final,我有一些石英工作。在应用程序执行期间,我必须验证特定作业是否正在运行。
我已经可以访问这些作业,但每个作业都有一个由quartz创建的名称。这是接缝注射的代码:
@In("org.jboss.seam.async.dispatcher")
private QuartzDispatcher quartzDispatcher;
要获得正在运行的作业,我有以下代码:
Scheduler scheduler = quartzDispatcher.getScheduler();
List<JobExecutionContext> currentJobs;
currentJobs = scheduler.getCurrentlyExecutingJobs();
for (JobExecutionContext jobCtx: currentJobs){
System.out.println(jobCtx.getJobDetail().getName());
}
任何人都知道如何使用jboss-seam为石英作业命名?我做了一些研究,并在jira上找到了这张票:https://issues.jboss.org/browse/JBSEAM-4399
答案 0 :(得分:1)
Seam为每个作业生成一个基于UUID的唯一名称,没有直接的方法来覆盖它。您的替代方案是:
使用找到的补丁,这需要使用添加的自定义代码构建自定义Seam库。
使用您自己的自定义调度程序覆盖OOTB quartz调度程序,覆盖scheduleWithQuartzService
方法并使用您自己的方案命名作业(查看您将看到的org.jboss.seam.async.QuartzDispatcher
的源代码它调用nextUniqueName()
方法为作业生成一个新的唯一名称,您需要从其他地方获取作业名称,最终通过注释找到与您找到的补丁相同的方式。“ / p>
您可以创建一个实现org.quartz.JobListener
的quartz事件侦听器,并在作业开始时注册并在全局哈希表或类似事件中结束执行,而不是尝试根据其名称查看作业是否正在运行那。然后,您在哈希表中查找作业以获取其状态,而不是按名称搜索它。但是,只有在您的调度程序未集群时才会起作用(quartz将仅通知本地节点中的侦听器,其他节点将不知道该作业已被触发)。