领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多我们很高兴地宣布 Spring Batch 4.1.0.M1 现已在 Github 和 Pivotal 下载库中提供。非常感谢所有为本次发布做出贡献的人!
以下是此版本的亮点
Spring Batch 提供了一些不错的实用程序类(例如 JobLauncherTestUtils
和 JobRepositoryTestUtils
)和测试执行监听器(StepScopeTestExecutionListener
和 JobScopeTestExecutionListener
)来测试批处理组件。但是,为了使用这些实用程序,必须像以下示例所示那样显式配置它们。
@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。
MessagingTemplate
,用于在主节点和工作节点之间发送请求。ChunkMessageChannelItemWriter
),它知道如何将数据块发送到工作节点进行处理和写入。ChunkProcessorChunkHandler
),用于接收来自主节点的数据。乍一看,这可能有点令人生畏。在此里程碑中,我们尝试通过引入一个名为 @EnableBatchIntegration
的新注解以及新的 API(RemoteChunkingMasterStepBuilder
和 RemoteChunkingWorkerBuilder
)来简化配置,从而使这项任务尽可能地简单。以下是一个示例。
@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 的新项目读取器。与 XML 的 StaxEventItemReader
类似,JsonItemReader
使用流式 API 以块的形式读取 JSON 对象。支持两个 JSON 库:Jackson 和 Gson。JsonItemReader
能够读取以下格式的 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,或在 StackOverflow 或 Gitter 上提问。如果您发现任何问题,请在 Jira 上提交工单。
在下一个里程碑中,我们计划:
JsonItemWriter
以补充 JsonItemReader
。敬请期待!