2013-02-19 2 views
1

AMQP에 메시지를 제출할 때 교환이 존재하지 않는지 여부를 감지 할 수 있기를 원합니다.py-amqp와 교환을 감지하는 방법

다음 예제를 고려하십시오.

#!/usr/bin/python 

import amqp 
from time import sleep 

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest", virtual_host="/") 
outgoing = conn.channel() 
message = amqp.Message("x") 


while True: 
    print "publish message." 
    outgoing.basic_publish(message,exchange="non-existing",routing_key="fubar") 
    sleep(1) 

이 스크립트는 교환에 게시를 유지하지만 교환이 존재하지 않으면 오류를 발생시키지 않습니다. 교환이 존재하면 메시지가 도착합니다.

#!/usr/bin/python 

import amqp 
from time import sleep 

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest", virtual_host="/") 
outgoing = conn.channel() 
message = amqp.Message("x") 


while True: 
    print "publish message." 
    outgoing.basic_publish(message,exchange="non-existing",routing_key="fubar") 
    outgoing.wait() 
    sleep(1) 

나는()는 amqp.exceptions.NotFound 내가 원하는 무엇 인 발생 outgoing.wait 추가 할 때. 그러나 문제는이 경우 Exchange가 존재하면 메시지가 도착하지만 outgoing.wait()가 내 루프를 차단한다는 것입니다. (별도의 스레드에서 outgoing.wait()을 실행할 수 있지만 수행하고 싶지는 않습니다.)

처리 방법은 무엇입니까?

어떤 조언 팁 포인터는

감사합니다,

제이을 환영

답변

1

불행히도 basic_publish에서 예외를 확인해야 차단 호출(). 당신이 할 수있는 일, 그러나 한 번 비동기 루프를 입력하기 전에 차단 호출을 실행 :

# send a test message synchronously to see if the exchange exists 
test_message = amqp.Message('exchange_test') 
outgoing.basic_publish(test_message,exchange="non-existing",routing_key="fubar") 
try:  
    outgoing.wait() 
except amqp.exceptions.NotFound: 
    # could not find the exchange, so do something about it 
    exit() 

while True: 
    # fairly certain the exchange exists now, run the async loop 
    print "publish message." 
    outgoing.basic_publish(message,exchange="non-existing",routing_key="fubar") 
    sleep(1) 
2

당신은 교환이있는 경우, 밖으로 찾을 exchange_declare 방법을 사용하여 True로 수동 플래그를 설정하십시오. 패시브 플래그를 True로 설정하면 서버가 교환을 생성하지 못하게되고 교환이 존재하지 않으면 오류가 발생합니다.

교환하기 전에 교환이 이루어 졌는지 확인하는 경우 송신 루프에 넣기 전에 선언하십시오. 교환 프로그램이 이미 존재한다면 아무 일도 일어나지 않을 것입니다. 교환이 없으면 생성됩니다.

https://github.com/celery/py-amqp/blob/master/amqp/channel.py#L460-L461

: 여기
import amqp 

conn = amqp.Connection(host="localhost:5672", userid="guest", password="guest", 
         virtual_host="/") 
outgoing = conn.channel() 
outgoing.exchange_declare("fubar", "direct") 

당신이 사용하고있는 AMQP 라이브러리에 exchange_declare 방법 선언에 대한 링크입니다
관련 문제