Java 如何为rabbit mq侦听器设置关机参数
我们正在尝试关闭所有在micro服务中运行的进程Java 如何为rabbit mq侦听器设置关机参数,java,spring-boot,spring-rabbit,Java,Spring Boot,Spring Rabbit,我们正在尝试关闭所有在micro服务中运行的进程 尝试确认时,当前正在执行某些工作的任何消费者 他们当前的信息 频道上的任何其他操作。我想让消费者 完成他们正在处理的任何消息,然后关闭所有内容 放下 如果我们停止正在运行的进程并允许数据传输,那么等待到shutdownhook timeout中提到的指定时间段,然后它就会被终止 我们已经创建了如下的bean @Bean public SimpleMessageListenerContainer SimpleMessageListenerCo
@Bean
public SimpleMessageListenerContainer SimpleMessageListenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(rabbitConnectionFactory);
container.setIdleEventInterval(60000L);
container.setShutdownTimeout(900000); // tried
return container;
}
bean试图实现上述目标,但没有成功。我们使用的是SpringRabbit1.7.3.RELEASE
日志:
已尝试将关闭属性设置为容器,但在默认情况下,它仍会在秒或之前关闭;而不是覆盖集属性
- 如果我们必须为每个入站通道适配器配置100多个通道,那么为每个入站通道适配器设置关机属性是否更好
- 我们已经通过STS中的terminate按钮和控制台中的ctr+c测试了达到1点和2点以上的,但它没有等待提到的关机时间。请对此提供帮助
- 有没有办法确定停机时间运行的持续时间
@SpringBootApplication
public class So48747564Application {
public static void main(String[] args) {
SpringApplication.run(So48747564Application.class, args);
}
@Bean
public ApplicationRunner runner(RabbitTemplate template, SimpleMessageListenerContainer container) {
return args -> {
Scanner scanner = new Scanner(System.in);
String line = null;
while (!"quit".equals(line)) {
line = scanner.nextLine();
template.convertAndSend("so48747564", line);
}
scanner.close();
container.stop();
};
}
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory cf) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
container.setQueueNames("so48747564");
container.setMessageListener(new MessageListenerAdapter(new Object() {
@SuppressWarnings("unused")
public void handleMessage(String in) throws Exception {
System.out.println("Received: " + in);
Thread.sleep(5_000);
System.out.println("Listener exiting");
}
}));
container.setShutdownTimeout(10_000);
return container;
}
@Bean
public Queue queue() {
return new Queue("so48747564");
}
}
结果:
foo
Received: foo
Listener exiting
quit
Received: quit
2018-02-12 13:31:23.585 INFO 14916 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer
: Waiting for workers to finish.
Listener exiting
2018-02-12 13:31:28.589 INFO 14916 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer
: Successfully waited for workers to finish.
容器将等待
关闭超时
,因此当前正在处理的消息将在容器停止之前完成。如果那没有发生,编辑您的问题以准确解释您看到的内容,并添加显示关机顺序的调试日志。Sry现在我不在办公室。如果您有任何小样本示例来实现上面的场景STHX以获得回复和示例程序,这将非常有帮助。如果设置setShutdownTimeout来纠正我的错误,我们可以确认消息是否正确进程,它将在一段时间内以终止。它更不像这个概念右Runtime.getRuntime().addShutdownHook(新线程(){public void run(){System.out.println(“Running shutdownhook”);});正确的;您可以添加一个关闭钩子和应用程序上下文(调用container.stop()
)。Spring Boot会自动为您执行此操作。更新的日志和一些解释对此有帮助您必须在容器线程上运行侦听器;如果您通过QueueChannel
或ExecutorChannel
(或任何其他方式)将工作移交给另一个线程,则容器无法等待工作完成。无论如何,你不能这样做,除非你不介意丢失消息。显示您的完整配置。不,我们没有使用任何队列通道或执行器通道。这只是带有通道、入站、出站适配器和服务激活器调用类引用的xml配置
foo
Received: foo
Listener exiting
quit
Received: quit
2018-02-12 13:31:23.585 INFO 14916 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer
: Waiting for workers to finish.
Listener exiting
2018-02-12 13:31:28.589 INFO 14916 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer
: Successfully waited for workers to finish.