【发布时间】:2019-05-29 11:32:51
【问题描述】:
我使用这个示例作为 spring 批处理应用程序的起点,使用远程分块: https://github.com/benas/spring-batch-remote-chunking-sample/blob/master/src/main/java/io/github/benas/MasterConfiguration.java 在这个例子中,我添加了我的自定义读取器/写入器,但我没有更改任何配置。该示例工作正常,除了在所有从属设备完成后我无法停止工作。
我尝试使用 JobListner 来在 'afterJob' 方法中停止作业,但没有结果。
public class MyJobExecutionListener implements JobExecutionListener {
@Override
public void beforeJob(JobExecution jobExecution) {
// TODO Auto-generated method stub
}
@Override
public void afterJob(JobExecution jobExecution) {
System.out.println("afterJob start~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(jobExecution.getExitStatus().getExitCode());
System.out.println(jobExecution.getExitStatus().getExitDescription());
System.out.println(jobExecution.getStartTime());
System.out.println(jobExecution.getEndTime());
System.out.println(jobExecution.isRunning());
System.out.println(jobExecution.isStopping());
jobExecution.stop();
System.out.println("!!!!!!!!!");
System.out.println(jobExecution.isRunning());
System.out.println(jobExecution.isStopping());
System.out.println(jobExecution.getEndTime());
System.out.println("afterJob end~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
}
jobExecution.getExitStatus().getExitCode() 已完成 jobExecution.isStopping() 为 true,但应用仍在运行。
为了运行应用程序,我使用的是 SpringBoot(而不是将其作为单元测试运行,就像在示例中一样)
@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class AppStarter {
public static void main(String[] args) {
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!! start");
SpringApplication.run(AppStarter.class, args);
}
}
有没有办法在完成后停止应用程序?
【问题讨论】:
-
主机应该自动停止。还有其他东西阻止应用程序上下文停止(
ThreadPoolTaskExecutor或一些需要显式停止的 Spring Integration 组件)。您的应用程序中是否有其中之一?我知道您说您没有更改任何配置,但由于您使用的是 Spring Boot,它可能隐式添加了一些内容。你能分享你的回购吗? -
代码是本地的,在虚拟机上,所以我不能在公共仓库上发布它。在主配置类中,我有:` @Configuration @EnableBatchProcessing @EnableIntegration @PropertySource("classpath:application.properties") `
-
我也在使用JMS进行主从通信:
@Bean public IntegrationFlow outboundFlow(ActiveMQConnectionFactory jmsConnectionFactory) { return IntegrationFlows.from(masterRequests()) .handle(Jms.outboundAdapter(jmsConnectionFactory).destination("requests")) .get(); } @Bean public IntegrationFlow masterInboundFlow(ActiveMQConnectionFactory jmsConnectionFactory) { return IntegrationFlows.from(Jms.messageDrivenChannelAdapter(jmsConnectionFactory).destination("replies")) .channel(masterReplies()) .get(); } -
抱歉格式化,我还在习惯它
标签: java spring-batch