Java EE 7添加了使用JSR 352以标准方式执行批处理作业的功能。
<job id="myJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0"><step id="myStep"><chunk item-count="3"><reader ref="myItemReader"/><processor ref="myItemProcessor"/><writer ref="myItemWriter"/>
</chunk>
此代码片段是定义为XML(也称为Job XML)的Job Specification Language。 它使用面向项目或面向块的处理,一步一步定义了规范的工作。 块可以具有读取器,可选处理器和写入器。 这些元素中的每一个都使用Job XML中的相应元素进行标识,并且是打包在归档文件中的CDI bean。
可以使用以下命令轻松开始此工作:
BatchRuntime.getJobOperator().start("myJob", new Properties());
在不同的论坛和会议上提出的一个典型问题是如何在Java EE运行时中安排这些作业。 Batch 1.0 API本身不提供任何可安排这些作业的内容。 但是,Java EE平台提供了三种不同的方式来调度这些作业:
- 在EJB中使用
@javax.ejb.Schedule
批注。 这是一个示例代码,它将在每天的11:59:59 PM触发批处理作业的执行。@Singleton public class MyEJB {@Schedule(hour = "23", minute = "59", second = "59")public void myJob() {BatchRuntime.getJobOperator().start("myJob", new Properties());} }
当然,您可以更改
@Schedule
的参数以在所需的时间启动批处理作业。 - 如下所示,通过
javax.enterprise.concurrent.Trigger
使用ManagedScheduledExecutorService
:@Stateless public class MyStatelessEJB {@ResourceManagedScheduledExecutorService executor;public void runJob() {executor.schedule(new MyJob(), new Trigger() {public Date getNextRunTime(LastExecution lastExecutionInfo, Date taskScheduledTime) {Calendar cal = Calendar.getInstance();cal.setTime(taskScheduledTime);cal.add(Calendar.DATE, 1);return cal.getTime();}public boolean skipRun(LastExecution lastExecutionInfo, Date scheduledRunTime) {return null == lastExecutionInfo;}});}public void cancelJob() {executor.shutdown();} }
呼叫
runJob
启动执行作业程序和cancelJob
终止作业执行。 在这种情况下,比之前的任务晚一天开始新工作。 并且直到上一个被终止,它才开始。 您将需要更多错误检查才能正确执行。MyJob非常琐碎:
public class MyJob implements Runnable {public void run() {BatchRuntime.getJobOperator().start("myJob", new Properties());}}
当然,您可以通过在
@PostConstruct
调用此代码来自动调度它。 - 第二种技术的细微变化允许在固定的延迟后运行作业,如下所示:
public void runJob2() {executor.scheduleWithFixedDelay(new MyJob(), 2, 3, TimeUnit.HOURS); }
在调用
runJob2
方法2小时后执行第一个任务。 然后在后续执行之间要延迟3个小时。
您可以在Java EE平台中使用此支持。 另外,您还可以调用BatchRuntime.getJobOperator().start("myJob", new Properties());
也可以使用任何Quartz计划的方法。
- 您可以在WildFly上尝试所有这些方法 。
- github.com/javaee-samples/javaee7-samples上有大量的Java EE 7示例。
- 该特定示例可在github.com/javaee-samples/javaee7-samples/tree/master/batch/scheduling中找到 。
您如何安排批处理作业?
翻译自: https://www.javacodegeeks.com/2014/09/schedule-java-ee-7-batch-jobs.html