Java 如何为rabbit mq侦听器设置关机参数

Java 如何为rabbit mq侦听器设置关机参数,java,spring-boot,spring-rabbit,Java,Spring Boot,Spring Rabbit,我们正在尝试关闭所有在micro服务中运行的进程 尝试确认时,当前正在执行某些工作的任何消费者 他们当前的信息 频道上的任何其他操作。我想让消费者 完成他们正在处理的任何消息,然后关闭所有内容 放下 如果我们停止正在运行的进程并允许数据传输,那么等待到shutdownhook timeout中提到的指定时间段,然后它就会被终止 我们已经创建了如下的bean @Bean public SimpleMessageListenerContainer SimpleMessageListenerCo

我们正在尝试关闭所有在micro服务中运行的进程

  • 尝试确认时,当前正在执行某些工作的任何消费者 他们当前的信息
  • 频道上的任何其他操作。我想让消费者 完成他们正在处理的任何消息,然后关闭所有内容 放下

  • 如果我们停止正在运行的进程并允许数据传输,那么等待到shutdownhook timeout中提到的指定时间段,然后它就会被终止

  • 我们已经创建了如下的bean

     @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.