Почему не все сообщения опрашиваются из QueueChannel? - PullRequest
0 голосов
/ 06 ноября 2018

Я создал QueueChannel с capacity=500 и отправил туда 1000 сообщений. Не все из них напечатаны; номер последнего 567. Почему это так?

Вот код:

@SpringBootApplication
@IntegrationComponentScan
public class QueueChannelResearch {

    @Bean
    public IntegrationFlow lambdaFlow() {
        return f -> f.channel(c -> c.queue(500))

            .handle(System.out::println);
    }

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(QueueChannelResearch.class, args);

        MessageChannel inputChannel = ctx.getBean("lambdaFlow.input", MessageChannel.class);
        for (int i = 0; i < 1000; i++) {
            inputChannel.send(MessageBuilder.withPayload("w" + i)
                .build());
        }

        ctx.close();

    }

}

Вот вывод:

GenericMessage [payload=w1, headers={id=d97946f2-1cf6-d681-fa88-08a4e708e61e, timestamp=1541524850590}]
...
GenericMessage [payload=w567, headers={id=83ab8720-f1c1-a4b1-b2ac-2a24a93bd00c, timestamp=1541524850590}]
GenericMessage [payload=w566, headers={id=d97946f2-1cf6-d681-fa88-08a4e708e61e, timestamp=1541524850590}]
GenericMessage [payload=w567, headers={id=83ab8720-f1c1-a4b1-b2ac-2a24a93bd00c, timestamp=1541524850590}]

1 Ответ

0 голосов
/ 06 ноября 2018

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

Поскольку в вашем приложении нет хуков для отслеживания сообщений, я могу только предложить добавить Thread.sleep(10000) до этого ctx.close().

Или вы можете добавить ловушку для ожидания ввода от пользователя в консоли:

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

Или просто не закрывайте ctx и полагайтесь на завершение JVM.

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