Маршрутизация выходного канала

Я пытаюсь переписать поток интеграции Spring с XML на Java. Я хочу маршрутизировать данные, отправленные по каналу:

@Bean(name = "sendData")
public MessageChannel getSendData() {
    return MessageChannels.direct()
                          .get();
}

на два других канала:

@Bean(name = "sendDataA")
public MessageChannel getSendDataA() {
    return MessageChannels.direct()
                          .get();
}

@Bean(name = "sendDataB")
public MessageChannel getSendDataB() {
    return MessageChannels.direct()
                          .get();
}

в зависимости от их наличия.

У меня есть класс RoundRobinRouter, который определяет, какой выходной канал использовать. У него есть метод route, который возвращает имя выходного канала, например:

@Component
class RoundRobinRouter {
    public String route(Object payload) {
        /* implementation */
    }
}

Обратите внимание, что реализация метода route фактически не использует объект payload. Ранее он был помещен в конфигурацию XML:

<int:router method="route" input-channel="sendData"
            default-output-channel="sendDataA">
    <bean
            class="com.example.RoundRobinRouter"/>
</int:router>

Я уже пробовал использовать Java DSL IntegrationFlow:

@Bean
@ServiceActivator(inputChannel = "sendData",
                  outputChannel = "sendDataA")
public IntegrationFlow routeRoundRobin() {
    return router -> router.route(roundRobinRouter, "route");
}

Но я получал сообщение об ошибке «У диспетчера нет подписчиков» при вызове sendData.send(payload), по всей видимости, по следующей причине:

org.springframework.expression.spel.SpelEvaluationException: EL1004E: (поз. 8): Вызов метода: Метод configure (com.example.DataType) не может быть найден для типа com.example.Integration $$ Lambda $ 1/1018103616

Маршрутизатор - единственная лямбда в моем классе интеграции.


person Jezor    schedule 24.09.2016    source источник


Ответы (1)


Хорошо, я заработал. Я не уверен, какое изменение устранило мою проблему, но вот правильная реализация маршрутизатора:

@Bean
public IntegrationFlow routeRoundRobin() {
    return IntegrationFlows.from(getSendData())
                           .route(roundRobinRouter, "route",
                                  r -> r.channelMapping("sendDataA",
                                                        "sendDataA")
                                        .channelMapping("sendDataB",
                                                        "sendDataB"))
                           .get();
}

@Bean(name = "sendData")
public MessageChannel getSendData() {
    return MessageChannels.direct()
                          .get();
}

@Bean(name = "sendDataA")
public MessageChannel getSendDataA() {
    return MessageChannels.direct()
                          .get();
}

@Bean(name = "sendDataB")
public MessageChannel getSendDataB() {
    return MessageChannels.direct()
                          .get();
}

Я изменил @ServiceActivator на IntegrationFlow с sendData, а также добавил отображение каналов в маршрутизатор.

person Jezor    schedule 09.10.2016