java的

我的目标是通过GlassFish服务器上的Quartz调度程序启动JSR-352批处理作业,但存在一个大问题。 首先,这是我的代码。

我的JSR-352工作:

<job id="myJob" ...>
    <step id="myBatchlet">
        <batchlet ref="mypackage.MyBatchlet" />
    </step>
</job>

相应的Java代码:

public class MyBatchlet implements Batchlet {

    @Override
    public String process() throws Exception {
        System.out.println("Hello World!");
        return BatchStatus.COMPLETED.toString();
    }

    @Override
    public void stop() throws Exception {
    }

}

当我通过一个servlet在GlassFish 4.0 b89服务器上开始这项工作时,它完美地工作:

public class StartJobServlet extends HttpServlet {

    private void processRequest(...) throws ... {
        long executionId = BatchRuntime.getJobOperator().start("myJob", new Properties());
        System.out.println("myJob started, execution ID = " + executionId);
    }

}

但是现在我想使用Quartz 2.2.3调度器,所以我写了Quartz作业:

public class StartMyJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        long executionId = BatchRuntime.getJobOperator().start("myJob", new Properties());
        System.out.println("myJob started, execution ID = " + executionId);
    }

}

我已经配置Quartz和这个工作的触发器。

但是,当myJob应该启动时,它仍然处于STARTING状态并且从未实际运行。
根据日志,实际启动批处理作业的com.ibm.jbatch.container.util.BatchWorkUnit::run过程永远不会被调用,而是在使用servlet时。

编辑:我发现了其他人的类似问题(相同的症状),但由于我没有glassfish-web.xml文件,给定的解决方案不能适应。


使用Quartz以在EE服务器内的非托管线程上执行作业的方式将导致使用各种EE API(包括Java Batch(JSR 352))的问题。

您可以使用标准EE API,例如ManagedScheduledExecutorService ,@ Schedule等来替换Quartz。 (这里有很多教程,例子)。

我不够Quartz专家列出涉及Quartz的替代方案。 看起来,如果你可以使用ManagedExecutorService运行Quartz线程,它就可以解决问题。 JIRA建议将这添加到Terracotta Quartz中,但我并不认为是确定的。 也许有一种使用开源Quartz的方法,既可以在服务器之外运行Quartz(并且远程访问像EJB这样的托管线程,不确定),甚至可以使用我不知道的配置选项。

如果任何人都可以提供更好的答案,澄清石英选项,这将是有益的。

链接地址: http://www.djcxy.com/p/23635.html

上一篇: java

下一篇: Quartz Scheduler: Maintain processed files list in the event job metadata