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 运行 的原因)。
我有一个将从 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 运行 的原因)。