如何使用带有jboss接缝的石英来了解特定作业是否正在运行?

时间:2013-03-15 18:28:16

标签: quartz-scheduler jboss-seam

我正在使用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

1 个答案:

答案 0 :(得分:1)

Seam为每个作业生成一个基于UUID的唯一名称,没有直接的方法来覆盖它。您的替代方案是:

  1. 使用找到的补丁,这需要使用添加的自定义代码构建自定义Seam库。

  2. 使用您自己的自定义调度程序覆盖OOTB quartz调度程序,覆盖scheduleWithQuartzService方法并使用您自己的方案命名作业(查看您将看到的org.jboss.seam.async.QuartzDispatcher的源代码它调用nextUniqueName()方法为作业生成一个新的唯一名称,您需要从其他地方获取作业名称,最终通过注释找到与您找到的补丁相同的方式。“ / p>

  3. 您可以创建一个实现org.quartz.JobListener的quartz事件侦听器,并在作业开始时注册并在全局哈希表或类似事件中结束执行,而不是尝试根据其名称查看作业是否正在运行那。然后,您在哈希表中查找作业以获取其状态,而不是按名称搜索它。但是,只有在您的调度程序未集群时才会起作用(quartz将仅通知本地节点中的侦听器,其他节点将不知道该作业已被触发)。