Spring 集成 RecipientListRouter 不会创建多个负载

Spring integration RecipientListRouter doesn't create multiple payloads

谁能帮我解决这个问题,我按照文档中的建议配置了 ReceipientListRouter:

@Bean
    public IntegrationFlow routerFlow() {
        return IntegrationFlows.from(CHANNEL_INPUT)
                .routeToRecipients(r -> r
                        .applySequence(true)
                        .ignoreSendFailures(true)
                        .recipient(CHANNEL_OUTPUT_1)
                        .recipient(CHANNEL_OUTPUT_2)
                        .sendTimeout(1_234L))
                .get();
    } 

@ServiceActivator(inputChannel = CHANNEL_OUTPUT_1, outputChannel = CHANNEL_END)
    public Object foo(Message<?> message) {
       message.gePayload();
      //  processing1() ...
    }

@ServiceActivator(inputChannel = CHANNEL_OUTPUT_2, outputChannel = CHANNEL_END)
    public Object bar(Message<?> message) {
       message.gePayload();
      //  processing2() ...
    }

我希望得到这个工作流程:

CHANNEL_INPUT(payload-1) |----> CHANNEL_OUTPUT_1(payload-2) 
                         |----> CHANNEL_OUTPUT_2(payload-3)

foo 激活器 输入端的 payload-2 等于 bar 激活器[=33] 输入端的 payload-1 和 payload-3 =] 等于 payload-1

但实际工作流程是:

foo 激活器 输入端的 payload-2 等于 payload-1,但 bar 激活器[=33] 输入端的 payload-3 =] 等于 foo activator

输出的 payload-2 消息

it seems like this is the actual workflow
CHANNEL_INPUT(payload-1)----> CHANNEL_OUTPUT_1(payload-2)----> CHANNEL_OUTPUT_2(payload-3)

调试后我注意到 message.getHeader() 不一样(它实际上包含 "sequenceNumber" 和 "sequenceSize")但是对于 message.getPayload 如上所述

虽然消息是不可变的,但有效负载不是(除非它是不可变的对象,例如字符串)。

如果您在 service1 中改变 payload,该改变将在 service2 中看到。

如果您不希望 service2 看到突变,您需要在突变之前 clone/copy 负载。