我有一个可以从RabbitMQ
队列中读取的批处理作业。我使用AmqpItemReader
作为读者。我面临的问题是,当批处理作业完成时,应用程序不会自行终止。我不确定我是否正确配置了RabbitTemplate
。如果有人可以帮我找出我的应用程序没有正常终止的原因,那就太好了。
RabbitConfig
上课:
@Configuration
@ConfigurationProperties("service.product.config.rabbitmq")
public class RabbitConfig {
@Setter
private String host;
@Setter
private Integer port;
@Setter
private String username;
@Setter
private String password;
@Setter
private String exchangeName;
@Setter
private String queueName;
@Bean
ConnectionFactory rabbitConnectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean
RabbitTemplate rabbitTemplate(ConnectionFactory rabbitConnectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(rabbitConnectionFactory);
rabbitTemplate.setQueue(queueName);
rabbitTemplate.setExchange(exchangeName);
return rabbitTemplate;
}
}
Job
上课:
@Configuration
@EnableBatchProcessing
public class ImportJobConfig {
private final Logger logger = LoggerFactory.getLogger(ImportJobConfig.class);
@Autowired
JobBuilderFactory jobBuilderFactory;
@Autowired
StepBuilderFactory stepBuilderFactory;
@Autowired
RabbitTemplate rabbitTemplate;
@Bean
public Job importJob() {
return jobBuilderFactory.get("importJob")
.listener(new JobExecutionListener() {
@Override
public void beforeJob(JobExecution jobExecution) {
logger.info("Ready to start the job");
}
@Override
public void afterJob(JobExecution jobExecution) {
logger.info("Job successfully executed.");
}
})
.incrementer(new RunIdIncrementer())
.flow(stepBuilderFactory.get("importStep")
.<String, String>chunk(2)
.reader(new AmqpItemReader<>(rabbitTemplate))
.listener(new QueueListener<>())
.processor(new CustomItemProcessor())
.writer(new CustomItemWriter())
.build())
.end()
.build();
}
}
修改 我的主要方法类:
@SpringBootApplication
public class BulkImportProductApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(BulkImportProductApplication.class);
app.setWebEnvironment(false);
app.run(args);
}
}
编辑结束
我使用的依赖关系:
spring-boot-starter-amqp
spring-boot-starter-batch
com.h2database:h2
spring-batch-test
spring-boot-starter-test
如果您需要任何可以帮助您找到工作完成后我的工作没有终止的原因,请告诉我。
答案 0 :(得分:1)
您main()
方法的位置在哪里?你如何创建应用程序上下文?
作业完成时,您需要close()
应用程序上下文;您可以使用JobExecutionListener
来检测作业何时完成。
关闭上下文将在连接工厂上调用destroy()
(这可能是保持JVM运行的原因)。