我花了很多时间阅读有关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/

10-10 02:39