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 { @Resource ManagedScheduledExecutorService 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