Spring integration Spring集成:使用子流映射出错:无法查找名为';正确';

Spring integration Spring集成:使用子流映射出错:无法查找名为';正确';,spring-integration,Spring Integration,我在我的“正常”代码中遇到了这个错误,并且能够在一个简单的junit测试中重现它。 此错误是使用.route(…)…子流映射(…) 如果我注释.route(..)代码输出,则测试运行成功 请有人解释一下为什么Spring Integration试图找到“真实”通道,而不是路由到真实的子流 @Test public void testDynaSubFlowCreation() { Flux<Message<?>> messageFlux = Flux.just("1

我在我的“正常”代码中遇到了这个错误,并且能够在一个简单的junit测试中重现它。 此错误是使用
.route(…)…子流映射(…)
如果我注释
.route(..)
代码输出,则测试运行成功

请有人解释一下为什么Spring Integration试图找到“真实”通道,而不是路由到真实的子流

@Test
public void testDynaSubFlowCreation() {
    Flux<Message<?>> messageFlux = Flux.just("1,2,3,4").map(v -> v.split(",")).flatMapIterable(Arrays::asList)
            .map(Integer::parseInt).map(GenericMessage<Integer>::new);

    QueueChannel resultChannel = new QueueChannel();

    IntegrationFlow integrationFlow = IntegrationFlows
            .from(messageFlux)
            .<Integer, Boolean>route(p->p % 2 == 0, m->m
                    .subFlowMapping(true, sf-> sf.<Integer, String>transform(em->{return "even:"+em;}).log())
                    .subFlowMapping(false, sf-> sf.<Integer, String>transform(em->{return "odd:"+em;}).log())
                    .defaultOutputToParentFlow()
                    )
            .log(l -> "!!!!!!!!!!!!!!!!!!!!!!! end int="+l)
            .channel(resultChannel)
            .get();

    this.flowContext.registration(integrationFlow).register();

    int queueSize = resultChannel.getQueueSize();
    assertThat(queueSize).as("queueSize").isEqualTo(4);
}
@阿尔特姆·比兰:
我不完全确定动态注册是否是问题的根源。 我静态配置了相同的流,如下所示:

@EnableIntegration
@Configuration
public class IntegrationTestConfig {

    @Bean
    public QueueChannel resultChannel() {
        return new QueueChannel();
    }

    @Bean
    public Flux<Message<?>> messageFlux(){
        return Flux.just("1,2,3,4").map(v -> v.split(",")).flatMapIterable(Arrays::asList)
                .map(Integer::parseInt).map(GenericMessage<Integer>::new);
    }

    @Bean
    public MessageChannel inputChannel() {
        return MessageChannels.direct().get();
    }

    @Bean
    public IntegrationFlow withSubFlows() {
        return IntegrationFlows
//              .from(inputChannel())
                .from(messageFlux())
                .<Integer, Boolean>route(p->p % 2 == 0, m->m
                        .subFlowMapping(true, sf-> sf.<Integer, String>transform(em->{return "even:"+em;}).log().bridge())
                        .subFlowMapping(false, sf-> sf.<Integer, String>transform(em->{return "odd:"+em;}).log().bridge())
                        .defaultOutputToParentFlow()
                        )
                .log(l -> "!!!!!!!!!!!!!!!!!!!!!!! end int="+l)
                .channel(resultChannel())
                .get();
    }
}

@RunWith(SpringRunner.class)
@SpringIntegrationTest
@SpringBootTest
    @Autowired
    public QueueChannel resultChannel;

    @Autowired
    public MessageChannel inputChannel;

    @Test
    public void testSubFlowCreation() {
        // fill input channel
        IntStream.range(0,4).forEach(i-> inputChannel.send(MessageBuilder.withPayload(i).build()));

        // receive results after flow processing
        assertThat(resultChannel.getReceiveCount()).as("receiveCount").isEqualTo(0);
        assertThat(resultChannel.receive(1000)).as("message").isNotNull();
        assertThat(resultChannel.getQueueSize()).as("queueSize").isEqualTo(3);
    }
}
@使能集成
@配置
公共类IntegrationTestConfig{
@豆子
公共队列通道结果通道(){
返回新的队列通道();
}
@豆子

公共流量已确认。这是
RouterSpec
中的一个错误。我们现在不能对动态注册的流使用
subFlowMapping()
。因为那里的逻辑基于
ContextRefreshedEvent
,在应用程序上下文启动时只发生一次:

@EnableIntegration
@Configuration
public class IntegrationTestConfig {

    @Bean
    public QueueChannel resultChannel() {
        return new QueueChannel();
    }

    @Bean
    public Flux<Message<?>> messageFlux(){
        return Flux.just("1,2,3,4").map(v -> v.split(",")).flatMapIterable(Arrays::asList)
                .map(Integer::parseInt).map(GenericMessage<Integer>::new);
    }

    @Bean
    public MessageChannel inputChannel() {
        return MessageChannels.direct().get();
    }

    @Bean
    public IntegrationFlow withSubFlows() {
        return IntegrationFlows
//              .from(inputChannel())
                .from(messageFlux())
                .<Integer, Boolean>route(p->p % 2 == 0, m->m
                        .subFlowMapping(true, sf-> sf.<Integer, String>transform(em->{return "even:"+em;}).log().bridge())
                        .subFlowMapping(false, sf-> sf.<Integer, String>transform(em->{return "odd:"+em;}).log().bridge())
                        .defaultOutputToParentFlow()
                        )
                .log(l -> "!!!!!!!!!!!!!!!!!!!!!!! end int="+l)
                .channel(resultChannel())
                .get();
    }
}

@RunWith(SpringRunner.class)
@SpringIntegrationTest
@SpringBootTest
    @Autowired
    public QueueChannel resultChannel;

    @Autowired
    public MessageChannel inputChannel;

    @Test
    public void testSubFlowCreation() {
        // fill input channel
        IntStream.range(0,4).forEach(i-> inputChannel.send(MessageBuilder.withPayload(i).build()));

        // receive results after flow processing
        assertThat(resultChannel.getReceiveCount()).as("receiveCount").isEqualTo(0);
        assertThat(resultChannel.receive(1000)).as("message").isNotNull();
        assertThat(resultChannel.getQueueSize()).as("queueSize").isEqualTo(3);
    }
}