2013-01-17 3 views
1

나는 RabbitMQ 교환기에 내구성있는 메시지를 보내는 생산자가 있습니다. RabbitMQ 메모리 또는 디스크가 워터 마크 임계 값을 초과하면 RabbitMQ가 내 제작자를 차단합니다. 설명서에 따르면 소켓에서 읽는 것을 멈추고 하트 비트를 일시 중지합니다.알람 기반 차단 RabbitMQ 제작자를 감지하는 방법?

내가 원하는 것은 생산자 코드에서 내가 차단되었음을 알 수있는 방법입니다. 현재 하트 비트가 활성화되어 있어도 모든 것이 영원히 멈추게됩니다. 내가 차단되어 사용자에게 경고하고/또는 다른 조치를 취할 수 있음을 알 수 있도록 일종의 예외를 받고 싶습니다. 그러나이 작업을 수행 할 방법을 찾을 수 없습니다. Java 및 C# 클라이언트를 모두 사용하고 있으며이 기능이 모두 필요합니다. 어떤 충고? 감사.

가 연결이 차단되었을 때 채널을 설정하려고 주변을 중심으로 비슷한 문제가 있었다 :-(이것이 불가능하면 있지만 (적어도 2.8.6와) RabbitMQ로 말할

답변

0

죄송합니다. 그 결과는 여러분이 경험 한 것과 같습니다.

RabbitMQ C# .Net Library의 실제 코어에 대한 조사를 한 결과, 문제의 근본 원인은 무한 차단 상태라는 것입니다.

RabbitMQ 메일 링리스트에 대한 자세한 내용은

을 참조하십시오.

http://rabbitmq.1065348.n5.nabble.com/Net-Client-locks-trying-to-create-a-channel-on-a-blocked-connection-td21588.html

한 가지 제안 (우리가 구현하지 않았다) 스레드의 내부 작업을 수행하고 다른 구성 요소가 타임 아웃을 관리하고이를 초과하면 스레드를 죽이는 것이 었습니다. 우리는

:-(위험을 받아
+1

고마워요 ... 예, 나는 그것을 두려워했습니다. 스레드를 죽이는 경로에 대해 생각했지만 너무 고통 스럽습니다. 나중 버전에서 블록이 아닌 예외를 얻을 수있는 옵션이 있기를 바랍니다. 그동안 메모리 및 디스크 알람은 물론 사용 및 제한 사항을 주시하는 폴링 스레드를 구현했습니다. 알람이 곧 설정 될 수있는 곳에 사용량이 가까워지면 차단되지 않도록 조치하고 사용자에게 경고합니다. – metaforge

+0

On [flow control doc] (http : // www.rabbitmq.com/memory.html)는 이라고 말합니다. RabbitMQ는 AMQP 0-9-1에 대한 확장을 제공하여 클라이언트가 연결이 차단되었을 때 ** 알림을받을 수 있도록합니다 **. [차단 된 연결 알림] (http://www.rabbitmq.com/connection-blocked.html) – chk

0

Rabbitmq 무기한 응답을 수신 차단 RPC 호출을 사용

당신이 자바 클라이언트 API를 보면, 그것이 무엇을하는 것입니다 :.

AMQChannel.BlockingRpcContinuation k = new AMQChannel.SimpleBlockingRpcContinuation(); 
    k.getReply(-1); 

회신을받을 때까지 인수 블록을 -1로 통과했습니다. 좋은 점은 클라이언트 병을 업데이트해야한다는 것입니다.

이렇게해도 괜찮다면 위와 같은 차단 호출이있을 때마다 시간 초과를 전달할 수 있습니다. 코드가 같은 것을 보일 것이다

try { 
        return k.getReply(200); 
       } catch (TimeoutException e) { 
        throw new MyCustomRuntimeorTimeoutException("RabbitTimeout ex",e); 
       } 

그리고 코드에서이 예외를 처리 할 수있는이 이벤트에 로직을 수행합니다.

이 수정 될 필요가있는 몇 가지 관련 클래스 :

com.rabbitmq.client.impl.AMQChannel 
com.rabbitmq.client.impl.ChannelN 
com.rabbitmq.client.impl.AMQConnection 

을 참고 :이 시도하고 그것은 작동합니다.