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 并在路由器功能中检查其内容。无论哪种方式,您都需要使用路由器。