2010-02-03 74 views
2

我想确保我的消息被传送到队列中。如何在AMQP的python客户端使用basic.return进行监听

为此,我将强制参数添加到basic_publish中。 如果我的邮件未成功发送,还应该怎么做才能收到basic.return邮件?

我不能使用channel.wait()来收听basic.return,因为当我的邮件成功发送时,wait()函数将永久挂起。 (没有超时) 另一方面。当我不呼叫channel.wait()时,channel.returned_messages将保持为空,即使邮件未送达。

我使用py-amqplib版本0.6。

任何解决方案,欢迎。

+0

我有蟒蛇鼠库完全一样的问题,看起来甚至没有人对这个问题的会谈。我找不到任何演示如何处理失败消息的代码片段。 – harry 2011-03-01 10:40:39

回答

1

当代理中放置消息时,由于basic.return是异步发送的,所以目前不可能。当消息发送成功时,不从服务器报告数据。 所以pyAMQP不能监听这样的消息。

我读过关于这个问题的几条线索。可能的解决方案是:

  • 使用txAMQP,AMQP,处理basic.return
  • 使用pyAMQP与等待与超时的扭曲版本。 (我不确定目前是否可行)
  • 经常使用同步命令ping服务器,以便pyAMQP能够在到达时选择basic.return消息。

由于对pyAMQP和rabbitMQ的支持水平一般都很低,我们决定根本不使用amqp代理。

1

您是否尝试过唯一完整的Python AMQP库?它没有被广泛使用,因为它没有整齐地包装。

步骤1.编译C库 - 你可能需要sudo apt-get install autotools-dev autoconf automake libtool

mkdir rabbitc 
cd rabbitc 
hg clone http://hg.rabbitmq.com/rabbitmq-codegen/ 
hg clone http://hg.rabbitmq.com/rabbitmq-c/ 
cd rabbitmq-c 
autoreconf -i 
make clean 
./configure --prefix=/usr 
make 
sudo make install 

步骤2.安装Python库

pip install pylibrabbitmq 
1

你不能这样做同步,因为它是一个异步系统。但是你可以使用线程来解决这个问题。

基本思想是,你启动一个线程,在通道上进行等待,每当它退出等待时,就会为返回的消息队列中的任何返回消息调用call_back函数。 然后,您可以与该消息处理,但是你想在call_back功能

def registerCallback(channel, call_back): 
    """ This method sets up a thread which deals with the asynchronous callback for a message which could not be routed by the exchange. 
    """ 
    def wait(): 
     try: 
      channel.wait() 
     except Exception, e: 
      print("Problem waiting on publish channel: %s" % str(e)) 

     while not channel.returned_messages.empty(): 
      returnedMessage = channel.returned_messages.get() 
      processReturnedMessageThread = Thread(target=call_back, args=(returnedMessage)) 
      processReturnedMessageThread.start() 

     wait() 

    waiting = Thread(target=wait) 
    waiting.start() 
相关问题