Spring 集成子流程取决于 .handle 方法
Spring Integration subflow depending on .handle method
我正在使用 spring 集成在特定重试完成后更改流程。我的 errorResponse IntegrationFlow bean 如下:
@Bean
public IntegrationFlow errorMailResponse(@Qualifier(ERROR_CHANNEL) PollableChannel errorChannel) {
return IntegrationFlows.from(errorChannel)
.handle(MessagingException.class, (payload, headers) -> handleMessageException(payload),
e -> e.poller(p -> p.fixedDelay(pollerInterval)))
.channel(NO_OUTPUT_CHANNEL)
.get();
}
If method handleMessageException
returns an object 我希望流程继续到特定通道 - MAIN_EVENTS_CHANNEL if handleMessageException
returns null 我想继续至 NO_OUTPUT_CHANNEL.
是否可以通过 Spring 集成来实现?我尝试使用子流,但我不确定是否是这样。 https://docs.spring.io/spring-integration/reference/html/dsl.html#java-dsl-subflows
@Bean
public IntegrationFlow errorMailResponse(@Qualifier(ERROR_CHANNEL) PollableChannel errorChannel) {
return IntegrationFlows.from(errorChannel)
.handle(MessagingException.class, (payload, headers) -> handleMailMessageException(payload),
e -> e.poller(p -> p.fixedDelay(pollerInterval)))
.publishSubscribeChannel(subscription -> subscription
.subscribe(subflow -> subflow
.<MailPojo>handle((payload, headers) -> {
// if if result handleMessageException == null
})
.channel(NO_OUTPUT_CHANNEL))
.subscribe(subflow -> subflow
.<MailPojo>handle((payload, headers) -> {
// if result handleMessageException !=null
})
.channel(MAIN_EVENTS_CHANNEL)))
.get();
}
感谢任何帮助。
首先 null
不是 payload
。因此消息在大多数情况下不支持 null
。集成流程在您 return null
: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#service-activator-namespace
处停止
The service activator is one of those components that is not required to produce a reply message. If your method returns null or has a void return type, the service activator exits after the method invocation, without any signals.
因此,您做出合乎逻辑的决定的假设对于 Spring 集成是不正确的。您需要考虑一些可以用作此类 NO_OUTPUT_CHANNEL
的信号的东西。您可以创建一个人为的 NullType
并使用 PayloadTypeRouter
来根据 return 从您的 handleMailMessageException()
:
得到的负载类型来确定下一步
.<Object, Class<?>>route(Object::getClass, m -> m
.channelMapping(MailPojo.class, MAIN_EVENTS_CHANNEL)
.channelMapping(NullType.class, NO_OUTPUT_CHANNEL))
另一种方法是使用 Optional
并在路由器功能中检查其内容。无论哪种方式,您都需要使用路由器。
我正在使用 spring 集成在特定重试完成后更改流程。我的 errorResponse IntegrationFlow bean 如下:
@Bean
public IntegrationFlow errorMailResponse(@Qualifier(ERROR_CHANNEL) PollableChannel errorChannel) {
return IntegrationFlows.from(errorChannel)
.handle(MessagingException.class, (payload, headers) -> handleMessageException(payload),
e -> e.poller(p -> p.fixedDelay(pollerInterval)))
.channel(NO_OUTPUT_CHANNEL)
.get();
}
If method handleMessageException
returns an object 我希望流程继续到特定通道 - MAIN_EVENTS_CHANNEL if handleMessageException
returns null 我想继续至 NO_OUTPUT_CHANNEL.
是否可以通过 Spring 集成来实现?我尝试使用子流,但我不确定是否是这样。 https://docs.spring.io/spring-integration/reference/html/dsl.html#java-dsl-subflows
@Bean
public IntegrationFlow errorMailResponse(@Qualifier(ERROR_CHANNEL) PollableChannel errorChannel) {
return IntegrationFlows.from(errorChannel)
.handle(MessagingException.class, (payload, headers) -> handleMailMessageException(payload),
e -> e.poller(p -> p.fixedDelay(pollerInterval)))
.publishSubscribeChannel(subscription -> subscription
.subscribe(subflow -> subflow
.<MailPojo>handle((payload, headers) -> {
// if if result handleMessageException == null
})
.channel(NO_OUTPUT_CHANNEL))
.subscribe(subflow -> subflow
.<MailPojo>handle((payload, headers) -> {
// if result handleMessageException !=null
})
.channel(MAIN_EVENTS_CHANNEL)))
.get();
}
感谢任何帮助。
首先 null
不是 payload
。因此消息在大多数情况下不支持 null
。集成流程在您 return null
: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#service-activator-namespace
The service activator is one of those components that is not required to produce a reply message. If your method returns null or has a void return type, the service activator exits after the method invocation, without any signals.
因此,您做出合乎逻辑的决定的假设对于 Spring 集成是不正确的。您需要考虑一些可以用作此类 NO_OUTPUT_CHANNEL
的信号的东西。您可以创建一个人为的 NullType
并使用 PayloadTypeRouter
来根据 return 从您的 handleMailMessageException()
:
.<Object, Class<?>>route(Object::getClass, m -> m
.channelMapping(MailPojo.class, MAIN_EVENTS_CHANNEL)
.channelMapping(NullType.class, NO_OUTPUT_CHANNEL))
另一种方法是使用 Optional
并在路由器功能中检查其内容。无论哪种方式,您都需要使用路由器。