如何解决将重排序器添加到输出通道会删除NoSuchBeanDefinitionException并更改ChannelMapper行为
我正在使用多个IntegrationFlow处理传入消息。在第一个通道上,我选择要处理的初始通道:
@Bean
public IntegrationFlow mappingFlow() {
return IntegrationFlows.from(inputChannel())
//route payload to channel
.handle(Message.class,(payload,header) -> (byte[])payload.getPayload())
.<byte[],Integer> route(p -> Parser.getType(p)),mapping -> mapping
.channelMapping(1,"1Channel")
.channelMapping(2,"2Channel")
.channelMapping(3,"3Channel")
.channelMapping(4,"4Channel")
)
.get();
}
它们之间还有其他几个Integrationflow,它们可以处理消息,然后将序列号从传入的有效负载复制到消息头:
@Bean
public IntegrationFlow process1Channel() {
return IntegrationFlows.from("1Channel")
.enrichHeaders(h ->
h.headerFunction(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER,message -> Parser.getSequenceNumber(byte[])(message.getPayload())
.handle(new GenericHandler<byte[]>() {
@Override
public Object handle(byte[] payload,MessageHeaders headers) {
...
return output;
}
})
.channel("output")
.get();
}
最后,有一个输出通道,该通道将创建的回复消息发送回呼叫者,其工作原理如下:
@Bean
public IntegrationFlow processOutput() {
return IntegrationFlows.from("output")
.handle(new GenericHandler<byte[]>() {
@Override
public Object handle(byte[] payload,MessageHeaders headers) {
...
return payload;
}
})
.get();
}
但是,由于我需要确保重新排序是基于前面的集成流程中设置的SequenceNumber,因此我尝试添加以下重新排序(可能有更好的方法来指定correlationExpression,但不指定一个结果在'java.lang.IllegalStateException:不允许空关联。也许CorrelationStrategy失败了?'):
.resequence(r -> r.releasePartialSequences(true).order(Ordered.LOWEST_PRECEDENCE).correlationExpression("headers[ip_connectionId]"))
现在的问题是,它可以工作,但是如果发送了未知/未定义的输入消息类型(例如msg类型8),则不再有异常: 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为'8'的bean
放置:
// .resolutionRequired(true)
对初始流的通道映射也没有影响,只要将重排序添加到输出通道(输出通道是我放置重排序的唯一位置)后,它似乎就被忽略了。此外,如果将重排序添加到输出中,则输入上的映射似乎根本不处理传入的未知消息,整个处理只是卡住了。
我只是通过添加上述重新排序方法来做错什么,我是否缺少默认值,在指定重新排序时需要明确设置默认值,或者这是一个错误(在outputChannel上添加重新排序会更改inputChannel映射行为)?
谢谢。
解决方法
仅当您的邮件具有IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER
标头时,重新排序器才能正常工作。然后,当您的发布策略返回true
时,将对组中的邮件进行排序并仅发出顺序的邮件,并且它们之间没有间隙。
您的路由器映射问题可能与重新排序程序问题完全无关:无论如何,resolutionRequired
默认为true
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。