Как ждут QueueChannel все сообщения обработаны? - PullRequest
0 голосов
/ 08 апреля 2020

Рассмотрим код:

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

Таким образом, все сообщения отправляются потребителю, но приложение завершает свою работу, не ожидая обработки всех сообщений. Есть ли способ сообщить весне, пока все сообщения в "канале" не будут обрабатываются?

1 Ответ

1 голос
/ 08 апреля 2020

Приложение Spring на самом деле является просто Java приложением, и на самом деле Spring не несет ответственности за контроль над тем, как будет работать ваше приложение. Вы можете использовать любую функцию Java для блокировки основного потока, пока не произойдет какое-либо событие.

Например, в наших примерах мы используем System.in.read() для блокировки основного потока:

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

В этом случае конечный пользователь должен ввести что-то из CLI, чтобы разблокировать этот поток и выйти из программы.

Другим способом является ожидание некоторого CountDownLatch, если вы заранее знаете несколько сообщений. Таким образом, при обработке сообщения вы должны «отсчитывать» защелку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...