GlassFish 上 Quartz 计划的 JSR-352 作业无法启动
Quartz-scheduled JSR-352 jobs on GlassFish won't start
我的目标是通过 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 时会被调用。
编辑:我发现了其他人的类似问题(同样的症状)there,但是给定的解决方案不适合,因为我没有 glassfish-web.xml 文件。
以在 EE 服务器内的非托管线程上执行作业的方式使用 Quartz 将导致使用各种 EE API 的问题,包括 Java Batch (JSR 352)。
您可以使用 ManagedScheduledExecutorService、@Schedule 等标准 EE API 来替换 Quartz。 (有很多教程和例子)。
我不是 Quartz 专家,无法列出涉及 Quartz 的替代方案。看起来,如果您可以使用 ManagedExecutorService 使 Quartz 线程达到 运行,那么问题就解决了。 This JIRA 表明这是添加到 Terracotta Quartz 中的,但我不确定。也许还有一种使用开源 Quartz 的方法,要么 运行 在服务器外部使用 Quartz,(并远程进入像 EJB 这样的托管线程?,不确定),或者甚至使用配置选项我'我不知道。
如果有人能提供更好的答案来阐明 Quartz 选项,那将很有帮助。
我的目标是通过 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 时会被调用。
编辑:我发现了其他人的类似问题(同样的症状)there,但是给定的解决方案不适合,因为我没有 glassfish-web.xml 文件。
以在 EE 服务器内的非托管线程上执行作业的方式使用 Quartz 将导致使用各种 EE API 的问题,包括 Java Batch (JSR 352)。
您可以使用 ManagedScheduledExecutorService、@Schedule 等标准 EE API 来替换 Quartz。 (有很多教程和例子)。
我不是 Quartz 专家,无法列出涉及 Quartz 的替代方案。看起来,如果您可以使用 ManagedExecutorService 使 Quartz 线程达到 运行,那么问题就解决了。 This JIRA 表明这是添加到 Terracotta Quartz 中的,但我不确定。也许还有一种使用开源 Quartz 的方法,要么 运行 在服务器外部使用 Quartz,(并远程进入像 EJB 这样的托管线程?,不确定),或者甚至使用配置选项我'我不知道。
如果有人能提供更好的答案来阐明 Quartz 选项,那将很有帮助。