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