0

我正在使用 Jboss-seam 2.2.2.Final 并且我有一些石英工作。在应用程序执行期间,我必须验证特定作业是否正在运行。

我已经可以访问这些工作,但每个工作都有一个由石英创建的名称。这是接缝注入的代码:

    @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

4

1 回答 1

1

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

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

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

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

于 2013-05-23T15:14:03.530 回答