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

Я пытаюсь переписать поток Spring Integration с 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): вызов метода: не удается найти метод конфигурации (com.example.DataType) для типа com.example.Integration$$Lambda$1/1018103616

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

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, а также добавлено сопоставление каналов с маршрутизатором.

Другие вопросы по тегам