簡體   English   中英

如何指定使用 Spring Cloud Stream 向 RabbitMQ 發送消息的超時時間?

[英]How to specify timeout for sending message to RabbitMQ using Spring Cloud Stream?

我們在發送消息的過程中遇到了網絡問題,這導致所有線程都處於阻塞狀態。 我們使用org.springframework.cloud:spring-cloud-stream:2.0.1.RELEASEorg.springframework:spring-messaging:5.0.8.RELEASE將消息發送到 RabbitMQ 代理。 綁定接口:

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);
    }
}

你能解釋為什么超時參數被忽略以及我如何配置它以避免長時間阻塞狀態嗎?

謝謝!

通道sendTimeout僅適用於通道本身可以阻塞的情況,例如一個QueueChannel具有當前已滿的有界隊列; 調用者將阻塞,直到隊列中有可用空間或超時發生。

在這種情況下,塊位於通道的下游,因此 sendTimeout 無關緊要(無論如何,它是一個無論如何都無法阻止的 DirectChannel,訂閱的處理程序直接在調用線程上調用)。

您看到的實際阻塞很可能是在 rabbitmq 客戶端的socket.write()中,它沒有超時且不可中斷; 調用線程無法執行任何操作來“超時”寫入。

我知道的唯一可能的解決方案是通過在連接工廠上調用resetConnection()來強制關閉兔子連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM