gpt4 book ai didi

java - 当流包含不同类型的 channel 时,如何调用 sendAndReceive?

转载 作者:行者123 更新时间:2023-12-01 12:37:00 24 4
gpt4 key购买 nike

我花了几个小时阅读有关 Spring Integration 的内容。今天我开始尝试这个框架。尽管我读了很多书,但它的工作原理的某些方面我还是难以理解。我希望这里有人能让我重回正轨。

我定义了以下 channel 和端点:

<in:channel id="orderSource"/>
<in:service-activator input-channel="orderSource"
ref="defaultOrderService"
method="placeOrder"/>

由于 channel 是 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 时,输入 channel 应该期望返回什么?

我当前的代码会阻塞,并且永远不会到达主线程的末尾。

当服务激活器传递给所有订阅者时,如何确保我收到包含服务激活器结果的回复?

此外,我真的很好奇当流中存在异步 channel 时,给定 channel 在返回值方面可以期望什么。我想在事务结束时和新线程生成之前获得结果,但我不知道该怎么做。

有什么想法、建议或指导吗?

最佳答案

据推测,您的“通知”方法返回 null。如果是这种情况,则不会向 MessagingTemplate 发送“回复” .

让最后一个返回订单,或者添加<bridge/>作为 pub-sub channel 的第四个订阅者,一无所获。

无处可去的桥就是一座没有输出 channel 的桥。当消息到达产生回复的端点时,并且没有 output-channel ,消息的replyChannel header 用于将回复路由到发起者。

它也适用于异步 channel ,但我需要先了解您的要求,然后才能提供指导。

此外,请考虑使用 Messaging Gateway在调用方,而不是自己构建消息并使用 MessagingTemplate 。该框架不会将您的调用者暴露给消息传递基础设施,而是会为您创建一个代理来处理所有这些事情,而您只需与 POJI 进行交互即可。

关于java - 当流包含不同类型的 channel 时,如何调用 sendAndReceive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com