Python Mqtt客户端可以';t不能同时处理多条消息

Python Mqtt客户端可以';t不能同时处理多条消息,python,sqlalchemy,activemq,mqtt,paho,Python,Sqlalchemy,Activemq,Mqtt,Paho,我正在尝试让mqtt客户端接收来自其订阅的主题的所有消息,但每次我使用另一个客户端发送消息时,它只接收第一条消息。问题是客户端应该处理10条qos为2的消息,但只处理第一条消息。消息以几毫秒的时间间隔同时发送。我不是经常发送消息。我每分钟发送10条消息。两个客户端都是持久的。我确信消息会离开发布者,因为无论何时发送消息,我都会打印它的有效负载。我使用qos 2是因为接收到的消息会保存到数据库中,我不希望有重复的消息。我使用的代理是activemq。所以问题是为什么会发生这种情况 from sql

我正在尝试让mqtt客户端接收来自其订阅的主题的所有消息,但每次我使用另一个客户端发送消息时,它只接收第一条消息。问题是客户端应该处理10条qos为2的消息,但只处理第一条消息。消息以几毫秒的时间间隔同时发送。我不是经常发送消息。我每分钟发送10条消息。两个客户端都是持久的。我确信消息会离开发布者,因为无论何时发送消息,我都会打印它的有效负载。我使用qos 2是因为接收到的消息会保存到数据库中,我不希望有重复的消息。我使用的代理是activemq。所以问题是为什么会发生这种情况

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
from sqlalchemy import update
from sqlalchemy.ext.automap import generate_relationship
import sqlalchemy
import paho.mqtt.client as mqtt
import time  
#Function that define what to do on client conenction
def on_connect(client, userdata, rc):
    #Subscribe to all specified topics
    mqttc.subscribe(topic='/+/mysignals/sensors/+/')
def on_message(client,userdata,message):
    #Get the mysignals member id from the topic
    topic_split = message.topic.split('/')
    member_id = topic_split[1]
    session = Session(engine)
    sensor_id = topic_split[4]
    patient = session.query(Patient).filter(Patient.mysignalsid==member_id).first()
    if message.payload == None:
        payload = 0
    else:
        payload = message.payload
    if patient:
        current_time = time.time()
        if patient.id in pending.keys() and (current_time - pending[patient.id]['time_created']) <= 55:
            pending[patient.id]['record'].__dict__[sensor_id] = payload
            print time.time()
        else:
            pending.pop(patient.id,None)
            patientdata = PatientData()
            patientdata.__dict__[sensor_id] = payload
            print patientdata.__dict__[sensor_id]
            print payload
            print patientdata.temp
            patient.patientdata_collection.append(patientdata)
            session.add(patientdata)
            print time.time()
            pending.update({patient.id:{
                                    'time_created':time.time(),
                                    'record':patientdata,
                                    }})
        session.flush()
        session.commit()
        print('Wrote to database.')

pending = {}
Base = automap_base()
engine = create_engine('mysql+mysqlconnector://user:pass@localhost/db')
# reflect the tables
Base.prepare(engine, reflect=True)
Patient = Base.classes.patient
PatientData = Base.classes.patientdata
session = Session(engine)
#Create a mqtt client object
mqttc = mqtt.Client(client_id='database_logger',clean_session=False)
#Set mqtt client callbacks
mqttc.on_connect = on_connect
mqttc.on_message = on_message
#Set mqtt broker username and password
mqttc.username_pw_set('blah','blahblah')
#Connect to the mqtt broker with the specified hostname/ip adress
mqttc.connect('127.0.0.1')
mqttc.loop_forever()
输出应为:

98
98
None
1500576377.3
Wrote to database.
25.4
25.4
25.4
1500576377.43
Wrote to database.

这最终不是mqtt客户机的问题。 代码错误,第二条消息没有写入数据库

为了使其正常工作,我必须更换以下线路:

pending[patient.id]['record'].__dict__[sensor_id] = payload
关于这一点:

setattr(pending[patient.id]['record'],sensor_id,payload)
另外,请删除该行:

session = Session(engine)
session.expunge_all()
session.commit()
在on_消息功能之外

我还添加了一行:

session = Session(engine)
session.expunge_all()
session.commit()
线下:

session = Session(engine)
session.expunge_all()
session.commit()

为了在每次数据库中完成事务时清理会话。

编辑问题以显示代码我更新了帖子并添加了代码。首先,主题不应以
/
开头和结尾,其次,您从代码中获得了什么输出?编辑问题,不要试图在评论中发布输出。你应该在答案中发布你的解决方案。此外,您不应该在标题中添加“已解决”,而是应该通过单击答案左侧的复选标记来接受答案。有关此网站如何工作的更多信息,请阅读。