gpt4 book ai didi

java - Spring Integration 的并发问题 - "Cannot publish to a deleted Destination"

转载 作者:行者123 更新时间:2023-11-30 07:55:43 25 4
gpt4 key购买 nike

我有两个应用程序在 ActiveMQ 代理的两侧运行;应用程序 1 向应用程序 2 发送同步请求,应用程序 2 将响应返回给应用程序 1。

应用1

@MessagingGateway
public interface OrderGateway {

@Gateway(requestChannel = "requestChannel", replyChannel = "responseChannel")
public OrderDto fetchOrder(OrderRequest orderRequest);
}

@Bean
public IntegrationFlow outgoingRequestFlow(ConnectionFactory connectionFactory) {

return IntegrationFlows.from("requestChannel")
.handle(Jms.outboundGateway(connectionFactory).requestDestination("order.queue"))
.get();
}

应用2

@Bean
public IntegrationFlow incomingRequestFlow(ConnectionFactory connectionFactory) {

return IntegrationFlows.from(Jms.inboundGateway(connectionFactory).destination("order.queue"))
.channel("requestChannel")
.handle("orderServiceActivator", "fetchOrder")
.channel("responseChannel")
.get();
}

@Component
public class OrderServiceActivator {

@Autowired
OrderService orderService;

@ServiceActivator
public OrderDto fetchOrder(OrderRequest orderRequest) {

return orderService.getById(orderRequest.getId());
}
}

两个应用程序都包含以下代理连接工厂配置:

@Bean(destroyMethod = "stop")
public PooledConnectionFactory activeMQConnectionFactory() {

ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL("tcp://broker.local:61616");

return new PooledConnectionFactory(activeMQConnectionFactory);
}

我在应用程序 1 /myapp/order/{id} 中创建了一个 REST Controller ,该 Controller 向 orderGateway.fetchOrder 提交请求,该 Controller 工作正常。然后我通过运行 while true; 来测试它。做curl http://localhost:8080/myapp/order/1;在命令行完成 并让它运行几分钟,这通过应用程序发送了数百个请求,没有错误,一切都很好。我可以看到 request.queue 正在 ActiveMQ 管理工具中对消息进行排队和出队,并且 ActiveMQ.Advisory.TempQueue 也有很高的入队/出队计数。

有并发请求时出现该问题;如果我打开两个终端窗口并在两个窗口中运行curl-loop,我很快就会开始看到以下错误:

Sep 21, 2015 4:35:25 PM org.springframework.jms.listener.DefaultMessageListenerContainer invokeErrorHandler
WARNING: Execution of JMS message listener failed, and no ErrorHandler has been set.
javax.jms.InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue://ID:Stans-MacBook-Pro.local-64816-1442849675850-1:1:559

我的 SI 配置是否错误?我还需要应用一些其他配置参数吗?感谢您的指导。

最佳答案

我需要查看双方的调试日志才能弄清楚发生了什么 - 这意味着客户端已超时;不过,默认超时时间为 5 秒。您可以增加出站网关上的receiveTimeout

也就是说,通常最好使用命名回复目标,以避免为每个请求创建临时回复队列。请记住,同样的超时也适用于此。

关于java - Spring Integration 的并发问题 - "Cannot publish to a deleted Destination",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32701791/

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