Java 当流包含不同类型的通道时,如何调用sendAndReceive?

Java 当流包含不同类型的通道时,如何调用sendAndReceive?,java,spring,integration,spring-integration,Java,Spring,Integration,Spring Integration,我花了几个小时阅读了有关Spring集成的内容。今天我开始试验这个框架。尽管我读了很多书,但我还是很难理解它是如何工作的。我希望这里有人能让我重回正轨 我已定义以下通道和端点: <in:channel id="orderSource"/> <in:service-activator input-channel="orderSource" ref="defaultOrderService"

我花了几个小时阅读了有关Spring集成的内容。今天我开始试验这个框架。尽管我读了很多书,但我还是很难理解它是如何工作的。我希望这里有人能让我重回正轨

我已定义以下通道和端点:

<in:channel id="orderSource"/>
<in:service-activator input-channel="orderSource" 
                          ref="defaultOrderService"
                          method="placeOrder"/>
在我的主要方法中,我有:

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();
现在的问题是,当我调用
send和receive
时,输入通道应该期望得到什么回报

我当前的代码块和我从未到达主线程的末尾

如何确保在service activator将结果传递给所有订阅者时收到包含结果的回复

另外,我真的很好奇,当流中有异步通道时,给定通道在返回值方面会有什么期望。我希望在事务结束时和新线程生成之前获得结果,但我不知道如何做到这一点

任何想法、建议或指导?

您的“notify”方法可能返回空值。如果是这种情况,则不会向
MessagingTemplate
发送“回复”

让最后一个用户返回订单,或添加一个
作为发布子频道的第四个订户

没有任何地方的网桥就是没有输出通道的网桥。当消息到达产生应答的端点时,如果没有
输出通道
,则消息的
应答通道
头将用于将应答路由到发起者

它也适用于异步通道,但在提供指导之前,我需要了解您的需求


也可以考虑在调用端使用A,而不是自己构建消息,并使用<代码> MasaGeMeg模板<代码>。而不是将调用者暴露在消息传递基础结构中,该框架将为您创建一个代理,负责所有这些,您只需与POJI进行交互。

我花了更多的时间阅读,发现这完全是在消息或网关中配置回复通道的问题,并使用bridge,就像Gary Rusell建议的那样为我做的

这是我的代码,现在正在工作:

<in:channel id="arrivals"/>
<in:service-activator input-channel="arrivals"
                      output-channel="validated"
                      ref="defaultOrderService"
                      method="validateOrder"/>
<in:channel id="validated"/>
<in:service-activator input-channel="validated"
                      output-channel="persisted"
                      ref="defaultOrderService"
                      method="placeOrder"/>

<in:publish-subscribe-channel id="persisted"/>

<in:channel id="replyChannel"/>

<in:bridge input-channel="persisted"  output-channel="replyChannel"/>

<in:outbound-channel-adapter channel="persisted"
                             ref="defaultOrderService"
                             method="notifyCustomerService"/>

<in:outbound-channel-adapter channel="persisted"
                             ref="defaultOrderService"
                             method="notifyShipmentManager"/>

<in:outbound-channel-adapter channel="persisted"
                             ref="defaultOrderService"
                             method="notifyWarehouseManager"/>

<in:gateway id="orderService"
            service-interface="codemasters.services.OrderService"
            default-request-channel="arrivals"
            default-reply-channel="replyChannel"/>

仅供参考;默认情况下,将按照解析订阅者的顺序调用订阅者;您可以通过向每个消费端点添加一个
order
属性(
order=“1”
等)来覆盖这一点(甚至只是为了文档说明您的意图)。@GaryRussell感谢Gary。这是我第一次遇到Spring集成。我正在尝试所有的选择。我刚刚将设置更改为使用订阅者的异步通知。这看起来一分钟比一分钟凉快:-)
<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"/>
<in:channel id="arrivals"/>
<in:service-activator input-channel="arrivals"
                      output-channel="validated"
                      ref="defaultOrderService"
                      method="validateOrder"/>
<in:channel id="validated"/>
<in:service-activator input-channel="validated"
                      output-channel="persisted"
                      ref="defaultOrderService"
                      method="placeOrder"/>

<in:publish-subscribe-channel id="persisted"/>

<in:channel id="replyChannel"/>

<in:bridge input-channel="persisted"  output-channel="replyChannel"/>

<in:outbound-channel-adapter channel="persisted"
                             ref="defaultOrderService"
                             method="notifyCustomerService"/>

<in:outbound-channel-adapter channel="persisted"
                             ref="defaultOrderService"
                             method="notifyShipmentManager"/>

<in:outbound-channel-adapter channel="persisted"
                             ref="defaultOrderService"
                             method="notifyWarehouseManager"/>

<in:gateway id="orderService"
            service-interface="codemasters.services.OrderService"
            default-request-channel="arrivals"
            default-reply-channel="replyChannel"/>
OrderService service = context.getBean("orderService", OrderService.class);
Order result = service.validateOrder(new Order(4321));