RabbitTemplate 未结束 spring 启动 + spring 批处理作业应用程序

RabbitTemplate not ending the spring boot + spring batch job app

我有一个将从 RabbitMQ 队列中读取的批处理作业。我使用 AmqpItemReader 作为 reader。我面临的问题是,当批处理作业完成时,应用程序不会自行终止。我不确定我是否正确配置了 RabbitTemplate。如果有人能帮我弄清楚为什么我的应用程序没有正常终止,那就太好了。

RabbitConfig class:

@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 class:

@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();
  }
}

编辑: 我的主要方法 class:

@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

如果您需要任何其他信息来帮助您找到为什么我的工作在完成后没有终止,请告诉我。

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

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

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