Spring Batch 4.1.0.M1 发布

发布 | Mahmoud Ben Hassine | 2018年5月31日 | ...

我们很高兴地宣布 Spring Batch 4.1.0.M1 现已在 Github 和 Pivotal 下载库中提供。非常感谢所有为本次发布做出贡献的人!

新增功能?

以下是此版本的亮点

  • 简化测试
  • 简化远程分块
  • 添加新的 JSON 项目读取器

简化测试

Spring Batch 提供了一些不错的实用程序类(例如 JobLauncherTestUtilsJobRepositoryTestUtils)和测试执行监听器(StepScopeTestExecutionListenerJobScopeTestExecutionListener)来测试批处理组件。但是,为了使用这些实用程序,必须像以下示例所示那样显式配置它们。

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {JobConfiguration.class, JobTest.TestConfiguration.class})
@TestExecutionListeners(listeners = {StepScopeTestExecutionListener.class, JobScopeTestExecutionListener.class})
public class JobTest {

   @Autowired
   private JobLauncherTestUtils jobLauncherTestUtils;

   @Autowired
   private JobRepositoryTestUtils jobRepositoryTestUtils;


   @Before
   public void clearMetadata() {
      jobRepositoryTestUtils.removeJobExecutions();
   }

   @Test
   public void testJob() throws Exception {
      // given
      JobParameters jobParameters = 
            jobLauncherTestUtils.getUniqueJobParameters();

      // when
      JobExecution jobExecution = 
            jobLauncherTestUtils.launchJob(jobParameters);

      // then
      Assert.assertEquals(ExitStatus.COMPLETED, 
                          jobExecution.getExitStatus());
   }

   @Configuration
   public static class TestConfiguration {

      @Bean
      public JobLauncherTestUtils jobLauncherTestUtils() {
         return new JobLauncherTestUtils();
      }

      @Bean
      public JobRepositoryTestUtils jobRepoTestUtils(DataSource dataSource,
                                               JobRepository jobRepository) {

         return new JobRepositoryTestUtils(jobRepository, dataSource);
      }

   }
}

在此版本中,我们引入了一个名为 @SpringBatchTest 的新注解,用于将类标记为 Spring Batch 组件的测试类。此注解会自动将实用程序 bean 和监听器添加到测试上下文中,并使它们自动可用于自动装配,如下例所示。

@RunWith(SpringRunner.class)
@SpringBatchTest
@ContextConfiguration(classes = {JobConfiguration.class})
public class JobTest {

   @Autowired
   private JobLauncherTestUtils jobLauncherTestUtils;

   @Autowired
   private JobRepositoryTestUtils jobRepositoryTestUtils;


   @Before
   public void clearMetadata() {
      jobRepositoryTestUtils.removeJobExecutions();
   }

   @Test
   public void testJob() throws Exception {
      // given
      JobParameters jobParameters = 
            jobLauncherTestUtils.getUniqueJobParameters();

      // when
      JobExecution jobExecution = 
            jobLauncherTestUtils.launchJob(jobParameters);

      // then
      Assert.assertEquals(ExitStatus.COMPLETED, 
                          jobExecution.getExitStatus());
   }
   
}

使用此新注解,您可以声明式地导入测试实用程序,并专注于测试批处理作业的业务逻辑。

简化远程分块

设置远程分块作业需要定义许多 bean。

  • 一个连接工厂,用于从消息中间件(JMS、AMQP 等)获取连接。
  • 一个 MessagingTemplate,用于在主节点和工作节点之间发送请求。
  • 一个输入通道和一个输出通道,用于 Spring Integration 从消息中间件获取消息。
  • 主节点上一个特殊的项目写入器(ChunkMessageChannelItemWriter),它知道如何将数据块发送到工作节点进行处理和写入。
  • 工作节点上一个消息监听器(ChunkProcessorChunkHandler),用于接收来自主节点的数据。

乍一看,这可能有点令人生畏。在此里程碑中,我们尝试通过引入一个名为 @EnableBatchIntegration 的新注解以及新的 API(RemoteChunkingMasterStepBuilderRemoteChunkingWorkerBuilder)来简化配置,从而使这项任务尽可能地简单。以下是一个示例。

@Configuration
@EnableBatchProcessing
@EnableBatchIntegration
public class RemoteChunkingAppConfig {
  
   @Autowired
   private RemoteChunkingMasterStepBuilderFactory masterStepBuilderFactory;
  
   @Autowired
   private RemoteChunkingWorkerBuilder workerBuilder;
  
   @Bean
   public TaskletStep masterStep() {
         return this.masterStepBuilderFactory
         	        .get("masterStep")
         	        .chunk(100)
         	        .reader(itemReader())
         	        .outputChannel(outgoingRequestsToWorkers())
         	        .inputChannel(incomingRepliesFromWorkers())
         	        .build();
   }
  
   @Bean
   public IntegrationFlow worker() {
         return this.workerBuilder
         	        .itemProcessor(itemProcessor())
         	        .itemWriter(itemWriter())
         	        .inputChannel(incomingRequestsFromMaster())
         	        .outputChannel(outgoingRepliesToMaster())
         	        .build();
   }
}

此新注解和构建器负责配置基础设施 bean 的繁重工作。您现在可以轻松地配置主节点步骤以及工作节点上的 Spring Integration 流。

添加新的 JSON 项目读取器

JSON 如今是一种流行的数据格式,许多应用程序都需要以批处理模式读取和写入 JSON 数据。在此第一个里程碑中,我们添加了一个支持 JSON 的新项目读取器。与 XML 的 StaxEventItemReader 类似,JsonItemReader 使用流式 API 以块的形式读取 JSON 对象。支持两个 JSON 库:JacksonGsonJsonItemReader 能够读取以下格式的 JSON 文件。

[
  {
    "isin": "123",
    "quantity": 1,
    "price": 1.2,
    "customer": "foo"
  },
  {
    "isin": "456",
    "quantity": 2,
    "price": 1.4,
    "customer": "bar"
  }
]

trades.json 文件的每个对象都表示以下 Trade 类的实例。

public class Trade {

   private String isin;
   private long quantity;
   private BigDecimal price;
   private String customer;

   // getters and setters omitted

}

为了读取此 trades.json 文件,您可以使用以下项目读取器(在此示例中使用 Jackson)。

@Bean
public JsonItemReader<Trade> jsonItemReader() {

   ObjectMapper objectMapper = new ObjectMapper();
   // configure the objectMapper as required
   JacksonJsonObjectReader<Trade> jsonObjectReader = 
            new JacksonJsonObjectReader<>(Trade.class);
   jsonObjectReader.setMapper(objectMapper);

   return new JsonItemReaderBuilder<Trade>()
                 .jsonObjectReader(jsonObjectReader)
                 .resource(new ClassPathResource("trades.json"))
                 .name("tradeJsonItemReader")
                 .build();
}

其他改进

此版本还包含许多其他改进、错误修复和文档更新。有关更改的完整列表,请查看 更改日志。我们期待听到您对此里程碑的反馈!请随时在 Twitter 上联系 @michaelminella@benas@cppwfs,或在 StackOverflowGitter 上提问。如果您发现任何问题,请在 Jira 上提交工单。

下一步是什么?

在下一个里程碑中,我们计划:

  • 简化远程分区设置(类似于在此里程碑中简化远程分块设置)。
  • 添加 JsonItemWriter 以补充 JsonItemReader
  • 向公共 API 添加 JSR-305 注解。

敬请期待!

Spring Batch 主页 | GitHub 上的源代码 | 参考文档

获取 Spring 电子邮件简报

通过 Spring 电子邮件简报保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部