Есть ли выходной канал по умолчанию, если поток DSL заканчивается конечной точкой? - PullRequest
0 голосов
/ 06 ноября 2018

Последним элементом в коде для следующего потока DSL является Service Activator (метод .handle). Есть ли прямой выходной прямой канал, на который я могу подписаться здесь? Если я правильно понимаю, выходной канал должен присутствовать enter image description here

Я знаю, что могу добавить .channel("name") в конце, но вопрос в том, что если это не написано явно. Вот код:

@SpringBootApplication
@IntegrationComponentScan
public class QueueChannelResearch {

    @Bean
    public IntegrationFlow lambdaFlow() {
        return f -> f.channel(c -> c.queue(50))
            .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();

    }

Другой вопрос касается QueueChannel. Программа зависает, если комментарий handle(), и завершает работу, если его раскомментируют. Означает ли это, что handle() добавляет перед ним Poller по умолчанию?

 return f -> f.channel(c -> c.queue(50));
       //         .handle(System.out::println);

1 Ответ

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

Нет, это так не работает.

Просто помните, что поток интеграции является архитектурой filter-pipes, и результат текущего шага будет отправлен следующему. Поскольку вы используете .handle(System.out::println), в этом вызове метода println() нет выходных данных, поэтому ничего не возвращается для создания сообщения для отправки на следующий канал, если таковой имеется. Итак, поток останавливается здесь. Возвращаемый тип void или возвращаемое значение null являются сигналом для сервисного активатора остановить поток. Рассмотрите ваш .handle(System.out::println) как <outbound-channel-adapter> в конфигурации XML.

И да: никаких каналов по умолчанию нет, если вы заранее не определите их с помощью заголовка replyChannel. Но опять же: ваш метод обслуживания должен возвращать что-то ценное.

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

Вопрос о QueueChannel будет лучше решать в отдельном потоке SO. Нет опроса по умолчанию, если вы не объявите его как PollerMetadata.DEFAULT_POLLER. Вы могли бы использовать какую-то библиотеку, которая делит эту библиотеку за вас.

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