gpt4 book ai didi

java - 如何指定使用Spring Cloud Stream向RabbitMQ发送消息的超时?

转载 作者:太空宇宙 更新时间:2023-11-04 09:15:26 24 4
gpt4 key购买 nike

我们在发送消息的过程中遇到了网络问题,这导致所有线程都处于阻塞状态。我们使用 org.springframework.cloud:spring-cloud-stream:2.0.1.RELEASE 和 org.springframework:spring-messaging:5.0.8.RELEASE 向 RabbitMQ 代理发送消息。绑定(bind)接口(interface):

interface MessagingSource {
@Output("bindingTargetName")
fun messageChannelOutput(): MessageChannel
}

用法:

 val isSent = messageSource.messageChannelOutput().send(message)

MessageChannel#send(Message, long) 方法也有以毫秒为单位的超时作为第二个参数,但在 org.springframework.integration.channel.AbstractSubscribableChannel#doSend 方法中进一步忽略:

@Override
protected boolean doSend(Message<?> message, long timeout) { // timeout is ignored in this method
try {
return getRequiredDispatcher().dispatch(message);
}
catch (MessageDispatchingException e) {
String description = e.getMessage() + " for channel '" + this.getFullChannelName() + "'.";
throw new MessageDeliveryException(message, description, e);
}
}

您能否解释一下为什么忽略超时参数以及如何配置它以避免长时间阻塞状态?

谢谢!

最佳答案

channel sendTimeout 仅适用于 channel 本身可以阻塞的情况,例如一个 QueueChannel ,其有界队列当前已满;调用者将阻塞,直到队列中有可用空间或发生超时。

在这种情况下,阻塞位于 channel 的下游,因此 sendTimeout 无关紧要(无论如何,它是一个 DirectChannel,无论如何都不能阻塞,订阅的处理程序会直接在调用线程上调用)。

您看到的实际阻塞很可能是在rabbitmq客户端的socket.write()中,它没有超时且不可中断;调用线程无法执行任何操作来使写入“超时”。

我知道的唯一可能的解决方案是通过在连接工厂上调用resetConnection()来强制关闭rabbit连接。

关于java - 如何指定使用Spring Cloud Stream向RabbitMQ发送消息的超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59089800/

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