Маршрутизация выходного канала
Я пытаюсь переписать поток 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
, а также добавлено сопоставление каналов с маршрутизатором.