我花了很多时间阅读有关Spring Integration的文章。今天,我开始尝试使用该框架。尽管阅读了很多书,但我还是很难理解它的工作方式。我希望这里有人能让我重回正轨。
我定义了以下通道和端点:
<in:channel id="orderSource"/>
<in:service-activator input-channel="orderSource"
ref="defaultOrderService"
method="placeOrder"/>
由于通道是DirectChannel,所以我希望所有事情都在单个线程中发生,并在最后获得返回值。
placeOrder
方法如下所示:@Override
public Order placeOrder(Order order) {
return order;
}
在我的主要方法中,我有:
MessageChannel input = context.getBean("orderSource", MessageChannel.class);
Message<Order> message = MessageBuilder.withPayload(new Order(123)).build();
MessagingTemplate messenger = new MessagingTemplate(input);
Message<?> result = messenger.sendAndReceive(message);
Object found = result.getPayload();
这一切都像一个魅力。
found
是服务激活器发回的命令。当我想通知一组订户已下订单时,我的问题就开始了。为了简单起见,让我们同步执行此操作,如下所示:
<in:channel id="orderSource"/>
<in:service-activator input-channel="orderSource"
output-channel="savedOrders"
ref="defaultOrderService"
method="validateOrder"/>
<in:publish-subscribe-channel id="savedOrders"/>
<in:outbound-channel-adapter channel="savedOrders"
ref="defaultOrderService"
method="notifyCustomerService"/>
<in:outbound-channel-adapter channel="savedOrders"
ref="defaultOrderService"
method="notifyShipmentManager"/>
<in:outbound-channel-adapter channel="savedOrders"
ref="defaultOrderService"
method="notifyWarehouseManager"/>
现在的问题是,当我调用
sendAndReceive
时,输入通道应该返回什么?我当前的代码块,而且我从未到达主线程的末尾。
如何确保收到将服务激活器传递给所有订阅者的结果的回复?
我也很好奇一个给定通道在流中存在异步通道时可以返回值的期望。我想在事务结束时和产生新线程之前获得结果,但是我不知道该怎么做。
有什么想法,建议或指导吗?
最佳答案
大概,您的“通知”方法返回null。如果是这种情况,则不会向MessagingTemplate
发送任何“答复”。
使最后一个返回订单,或在第一个订阅服务器上将<bridge/>
作为第四个订阅者添加到任何地方。
通往无处的桥梁就是没有输出通道的桥梁。当消息到达产生答复的端点并且没有output-channel
时,消息的replyChannel
标头用于将答复路由到始发者。
它也适用于异步通道,但是在提供指导之前,我需要先了解您的要求。
另外,请考虑在呼叫方使用Messaging Gateway,而不要自己构建消息并使用MessagingTemplate
。该框架不会将呼叫者暴露给消息传递基础结构,而是会为您创建一个代理,该代理将处理所有事务,并且您仅与POJI进行交互。
关于java - 当流包含不同类型的 channel 时,如何调用sendAndReceive?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25490767/