Spring 集成路由单
Spring Integration Routing Slip
我正在尝试使用spring集成实现路由单,配置如下
@Bean
@Transformer(inputChannel = "inputChannel", outputChannel = "replyChannel")
public HeaderEnricher headerEnricher() {
return new HeaderEnricher(Collections.singletonMap(IntegrationMessageHeaderAccessor.ROUTING_SLIP,
new RoutingSlipHeaderValueMessageProcessor("channel1", "channel2", "channel3"
, "channel4"
)));
}
和
@Bean
public MessageChannel inputChannel() {
return new DirectChannel();
}
@Bean
@BridgeTo
public MessageChannel replyChannel() {
return new DirectChannel();
}
为了在 header enricher 后查询路由单我添加了
@BridgeTo
此实现有效,但在调试 spring 代码后,我无意中发现了此代码并找出了问题所在。
在 UnicastingDispatcher 中 Class
private boolean doDispatch(Message<?> message) {
if (this.tryOptimizedDispatch(message)) {
return true;
}
boolean success = false;
Iterator<MessageHandler> handlerIterator = this.getHandlerIterator(message);
if (!handlerIterator.hasNext()) {
throw new MessageDispatchingException(message, "Dispatcher has no subscribers");
}
List<RuntimeException> exceptions = new ArrayList<RuntimeException>();
while (!success && handlerIterator.hasNext()) {
MessageHandler handler = handlerIterator.next();
try {
handler.handleMessage(message);
success = true; // we have a winner.
}
catch (Exception e) {
RuntimeException runtimeException = this.wrapExceptionIfNecessary(message, e);
exceptions.add(runtimeException);
this.handleExceptions(exceptions, message, !handlerIterator.hasNext());
}
}
return success;
}
Iterator<MessageHandler> handlerIterator = this.getHandlerIterator(message);
给予
[org.springframework.integration.jms.JmsSendingMessageHandler#11, routingSlip.replyChannel.bridgeTo.handler]
而且是循环采摘。
因此,一旦它选择了下一个 BridgeHandler 和 JmsSendingMessageHandler。
是不是有什么配置遗漏了一直在咨询BridgeHandler?
您的频道似乎有两个订阅者。
一个channel有多个consumer时round robin dispatch是正常的
我正在尝试使用spring集成实现路由单,配置如下
@Bean
@Transformer(inputChannel = "inputChannel", outputChannel = "replyChannel")
public HeaderEnricher headerEnricher() {
return new HeaderEnricher(Collections.singletonMap(IntegrationMessageHeaderAccessor.ROUTING_SLIP,
new RoutingSlipHeaderValueMessageProcessor("channel1", "channel2", "channel3"
, "channel4"
)));
}
和
@Bean
public MessageChannel inputChannel() {
return new DirectChannel();
}
@Bean
@BridgeTo
public MessageChannel replyChannel() {
return new DirectChannel();
}
为了在 header enricher 后查询路由单我添加了
@BridgeTo
此实现有效,但在调试 spring 代码后,我无意中发现了此代码并找出了问题所在。
在 UnicastingDispatcher 中 Class
private boolean doDispatch(Message<?> message) {
if (this.tryOptimizedDispatch(message)) {
return true;
}
boolean success = false;
Iterator<MessageHandler> handlerIterator = this.getHandlerIterator(message);
if (!handlerIterator.hasNext()) {
throw new MessageDispatchingException(message, "Dispatcher has no subscribers");
}
List<RuntimeException> exceptions = new ArrayList<RuntimeException>();
while (!success && handlerIterator.hasNext()) {
MessageHandler handler = handlerIterator.next();
try {
handler.handleMessage(message);
success = true; // we have a winner.
}
catch (Exception e) {
RuntimeException runtimeException = this.wrapExceptionIfNecessary(message, e);
exceptions.add(runtimeException);
this.handleExceptions(exceptions, message, !handlerIterator.hasNext());
}
}
return success;
}
Iterator<MessageHandler> handlerIterator = this.getHandlerIterator(message);
给予 [org.springframework.integration.jms.JmsSendingMessageHandler#11, routingSlip.replyChannel.bridgeTo.handler]
而且是循环采摘。 因此,一旦它选择了下一个 BridgeHandler 和 JmsSendingMessageHandler。
是不是有什么配置遗漏了一直在咨询BridgeHandler?
您的频道似乎有两个订阅者。
一个channel有多个consumer时round robin dispatch是正常的