Каналы интеграции Spring с именем бина против имени метода - PullRequest
0 голосов
/ 14 мая 2018

У меня есть PublishSubscribeChannel, например:

@Bean(name = {"publishCha.input", "publishCha2.input"}) //2 subscribers
    public MessageChannel publishAction() {
        PublishSubscribeChannel ps = MessageChannels.publishSubscribe().get();
        ps.setMaxSubscribers(8);
        return ps;
    }

У меня есть также каналы подписчиков:

@Bean
    public IntegrationFlow publishCha() {
        return f -> f
                .handle(m -> System.out.println("In publishCha channel..."));
    }


@Bean
    public IntegrationFlow publishCha2() {
        return f -> f
                .handle(m -> System.out.println("In publishCha2 channel..."));
    }

И, наконец, еще один подписчик:

@Bean
    public IntegrationFlow anotherChannel() {
        return IntegrationFlows.from("publishAction")
                .handle(m -> System.out.println("ANOTHER CHANNEL IS HERE!"))
                .get();
    }

Проблема в том,Когда я вызываю канал с именем метода «publishAction», как показано ниже, из другого потока, он выводит только «ДРУГОЙ КАНАЛ ЗДЕСЬ» и игнорирует других подписчиков.Однако, если я звоню с .channel("publishCha.input"), на этот раз он входит в подписчики publishCha и publishCha2, но игнорирует третьего подписчика.

@Bean
    public IntegrationFlow flow() { 
        return f -> f
       .channel("publishAction");
    }

Мой вопрос заключается в том, почему два разных метода ченнелинга дают разные результаты?

.channel("publishAction") // channeling with method name executes third subscriber

.channel("publishCha.input") // channelling with bean name, executes first and second subscribers

Редактировать: narayan-sambireddy запросил, как я отправляю сообщения на канал.Я отправляю его через шлюз:

@MessagingGateway
public interface ExampleGateway {

@Gateway(requestChannel = "flow.input")
    void flow(Order orders);
}

На основном:

Order order = new Order();
      order.addItem("PC", "TTEL", 2000, 1)
    ConfigurableApplicationContext ctx = SpringApplication.run(Start.class, args);
    ctx.getBean(ExampleGateway.class).flow(order);

1 Ответ

0 голосов
/ 14 мая 2018

Ваша проблема с третьим абонентом, которого вы пропускаете, цель name в @Bean:

/**
 * The name of this bean, or if several names, a primary bean name plus aliases.
 * <p>If left unspecified, the name of the bean is the name of the annotated method.
 * If specified, the method name is ignored.
 * <p>The bean name and aliases may also be configured via the {@link #value}
 * attribute if no other attributes are declared.
 * @see #value
 */
@AliasFor("value")
String[] name() default {};

Таким образом, имя метода в качестве имени компонента в этом случае игнорируется, поэтому Spring Integration Java DSL не находит компонент с publishAction и создает его - DirectChannel.

Вы можете использовать справочник по методу , хотя:

IntegrationFlows.from(publishAction())

Или, если он находится в другом классе конфигурации, вы можете повторно использовать одно из предопределенных имен "

 IntegrationFlows.from(publishCha.input)

Таким образом, DSL будет повторно использовать существующий компонент и просто добавит еще одного подписчика к этому каналу pub-sub.

...