【问题标题】:Retain Messages until a Subscription is Made using Python + Stomp保留消息直到使用 Python + Stomp 进行订阅
【发布时间】:2017-01-01 16:41:13
【问题描述】:

我目前正在编写两个脚本来订阅消息服务器,使用 stomp 客户端库,write.py 写入数据和 read.py em> 获取数据。

如果我先启动 read.py 然后运行 ​​write.pywrite.py 会正确接收消息。

但是,如果我先运行 write.py 然后再运行 read.pyread.py 不会检索之前发送的任何消息到服务器。

以下是脚本的相关部分。

如何实现 write.py 放入队列的消息在 read.py 订阅和检索它们之前一直保留?

write.py

def writeMQ(msg):
    queue = '/topic/test'
    conn = stomp.Connection(host_and_ports=[(MQ_SERVER, MQ_PORT)])
    try:
        conn.start()
        conn.connect(MQ_USER, MQ_PASSWD, wait=True)
        conn.send(body=msg, destination=queue, persistent=True)
    except:
        traceback.print_exc()
    finally:
        conn.disconnect()

    return

read.py

class MyListener(stomp.ConnectionListener):    
    def on_error(self, headers, message):    
        print ('received an error {0}'.format(message))    

    def on_message(self, headers, message):    
        print ('received an message {0}'.format(message))    


def readMQ():                                                
    queue = '/topic/test'     
    conn = stomp.Connection(host_and_ports=[(MQ_SERVER, MQ_PORT)])    
    try:                                                              
        conn.set_listener("", MyListener())                           
        conn.start()                                                  
        conn.connect(MQ_USER, MQ_PASSWD, wait=True)    

        conn.subscribe(destination=queue, ack="auto", id=1)                       


        stop = raw_input()                  
    except:                   
        traceback.print_exc()    
    finally:                     
        conn.disconnect()        

    return                   

【问题讨论】:

  • 您使用的是哪个消息服务器?您一直在谈论队列,但从外观上看,您将消息发送到主题而不是队列。这是故意的吗?应该有多少客户接收一条消息?
  • @bbastu 只有一个客户端应该接收一条消息。服务器是由另一个人设置的,我将检查详细信息。如果我想使用队列而不是主题,我需要在服务器上做一些修改还是只更新我的代码?
  • 我认为这取决于服务器。但是使用 apollo(我假设您正在使用)只需设置 queue=/queue/test。
  • @bbastu 是的,设置 queue=/queue/test 有效,感谢您的帮助。

标签: python python-2.7 message-queue stomp


【解决方案1】:

问题是消息被发送到一个主题。

Apollo Documentation 描述主题和队列的区别如下:

即使没有附加订阅,队列也会保留未使用的消息,而当没有连接的订阅时,主题会丢弃消息。

因此,当 read.py 首先启动并监听时,主题识别订阅并转发消息。但是当 write.py 首先是 startet 时,消息会被丢弃,因为没有订阅的客户端。

因此您可以使用队列而不是主题。如果服务器能够静默创建队列,只需设置

queue = '/queue/test' .

不知道用的是哪个版本的stomp,但是找不到参数

send(..., persistent=True) .

无论如何,持久化不是正确的方法,因为它仍然不允许简单地保留消息以供以后连接,但会保存消息以防服务器故障。

你可以使用

retain:set

改为主题消息的标题。

【讨论】:

  • 看来“persistent=True”是stompy.stomp中的用法,我只是把它弄混了。我尝试将“persistent”替换为“per”,它仍然有效,所以我认为参数“persistent”没有被使用,并且可以在函数send中随意添加额外的参数。
猜你喜欢
  • 1970-01-01
  • 2020-12-17
  • 2020-01-07
  • 2017-09-13
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多