计划Java EE 7批处理作业

符鸿光
2023-12-01

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平台提供了三种不同的方式来调度这些作业:

  1. 在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的参数以在所需的时间启动批处理作业。

  2. 如下所示,通过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调用此代码来自动调度它。

  3. 第二种技术的细微变化允许在固定的延迟后运行作业,如下所示:
    public void runJob2() {
        executor.scheduleWithFixedDelay(new MyJob(), 2, 3, TimeUnit.HOURS);
    }

    在调用runJob2方法2小时后执行第一个任务。 然后在后续执行之间要延迟3个小时。

您可以在Java EE平台中使用此支持。 另外,您还可以调用BatchRuntime.getJobOperator().start("myJob", new Properties()); 也可以使用任何Quartz计划的方法。

您如何安排批处理作业?

翻译自: https://www.javacodegeeks.com/2014/09/schedule-java-ee-7-batch-jobs.html

 类似资料: