我正在尝试开发一个协议转换器:这意味着有一个 sender.py (说MQTT ZMQ或其他协议), translator.py (说两个发送者的和接收者的协议)和 receiver.py (说AMQP)。发送方以可能是MQTT,ZMQ的协议发送消息......转换器接收这些消息,读取有效负载并将其发布到RabbitMQ代理。然后,receiver.py通过订阅以前使用绑定密钥绑定到交换机的队列来获取消息(例如:'#/ data')。
现在问题是每次收到MQTT消息我都会发布AQMP。然而,AMQP接收器没有获得所有发布的消息。仅当发布第4条消息时,才会收到所有消息中的第一条消息。然后,如果我发布另一个4,我可以看到第一次发布的seconth消息是在AMQP订阅者中收到的。
翻译的代码是:
#!/usr/bin/env python
import pika
import json
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
#When connected to MQTT broker
print("Connected with result code "+str(rc))
#Subscribe to all topics in MQTT
client.subscribe("#")
def on_message(client, userdata, msg):
#When mqtt message is received
message=json.loads(msg.payload)
allData=message['data']
for eachData in allData:
message['data']=eachData
routKey='eachData['topic']/data'
publish_amqp(routKey,message)
def publish_amqp(rk,msg):
channel.basic_publish(exchange='translator', routing_key=rk, body=json.dumps(msg))
print(rk+' - - '+json.dumps(msg))
client = mqtt.Client('MQTT_to_AMQP_Translator')
client.on_connect = on_connect
client.on_message = on_message
client.connect('localhost', 1883, 60)
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='translator',type='topic')
client.loop_forever()
但是,如果我使用第二个代码来发布而不是放在第一个代码块的方法中的唯一的sentece(basic_publish),我会得到正常的结果。代码是:
def publish_amqp(rk, msg):
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='translator',type='topic')
channel.basic_publish(exchange='translator', routing_key=rk, body=json.dumps(msg))
print(rk+' - - '+json.dumps(msg))
connection.close()
然后,最后一种方法一切正常。我真的不喜欢这种方法,因为最后一个代码意味着必须建立连接,声明一些值,发布和断开连接以及使用我可以“发布”的第一个代码,而无需重新连接等等。
为什么第一个代码会将消息延迟到接收方?我已经处理了这个问题,因为几天而且只有第二个代码块(我为每条消息连接,发布和断开连接)工作正常。