RabbitTemplate没有结束spring boot + spring批处理作业应用程序

时间:2017-11-13 20:35:33

标签: java spring-boot rabbitmq spring-batch spring-amqp

我有一个可以从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

如果您需要任何可以帮助您找到工作完成后我的工作没有终止的原因,请告诉我。

1 个答案:

答案 0 :(得分:1)

main()方法的位置在哪里?你如何创建应用程序上下文?

作业完成时,您需要close()应用程序上下文;您可以使用JobExecutionListener来检测作业何时完成。

关闭上下文将在连接工厂上调用destroy()(这可能是保持JVM运行的原因)。