如何等待QueueChannel处理所有消息?

时间:2020-04-08 07:54:58

标签: java spring spring-boot spring-integration

考虑一个代码:

@Configuration
public class MyConf {
      @MessagingGateway(defaultRequestChannel = "channel")
        public interface Sender {
            void send(String out);

        }

}

@Component
public class Consumer {
    @ServiceActivator(inputChannel = "channel", poller = @Poller(fixedRate = "100"))
    public void handle(String input) throws InterruptedException {
        //
    }
}

@Component
public class HistoricalTagRunner implements CommandLineRunner {
      @Autowired
      private Sender sender;

      @Override
      public void run(String... args) throws Exception {
            List<String> input = ...
            input.forEach(r -> sender.send(r));

            //ok, now all input is send and application exit
            //without waiting for message processing
      }
}

因此所有消息都发送给使用者,但是应用程序退出时不希望所有消息都已处理 有没有办法告诉spring等待“频道”中的所有消息都被处理?

1 个答案:

答案 0 :(得分:1)

Spring应用程序实际上只是Java应用程序,它不是Spring的责任来控制应用程序的运行方式。您可以使用任何Java功能来阻止主线程,直到发生某些事件为止。

例如,在我们的示例中,我们使用System.in.read()来阻止主线程:

    System.out.println("Hit 'Enter' to terminate");
    System.in.read();
    ctx.close();

在这种情况下,最终用户必须从CLI输入一些内容以解除对该线程的阻止并退出程序。

另一种方法是,如果您事先知道一些消息,则等待一些CountDownLatch。因此,处理消息时,您的流程必须“倒计时”扣锁。