[ https://issues.apache.org/jira/browse/AMQ-9592?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jean-Baptiste Onofré updated AMQ-9592: -------------------------------------- Fix Version/s: 6.2.0 6.1.4 5.18.7 > Incorrect MQTTv3.1.1 behaviour: QoS2 messages were delivered to unintended > consumers > ------------------------------------------------------------------------------------- > > Key: AMQ-9592 > URL: https://issues.apache.org/jira/browse/AMQ-9592 > Project: ActiveMQ Classic > Issue Type: Bug > Components: MQTT > Affects Versions: 5.18.5, 6.1.3 > Reporter: Ken Liao > Assignee: Jean-Baptiste Onofré > Priority: Major > Fix For: 6.2.0, 6.1.4, 5.18.7 > > > To replicate: > - Run a subscriber with QOS2 to a topic with client ID say "1"and stop it > - Publish 5 messages to the topic, do not consume these yet. > - Run another subscriber with QOS2 to the topic with a different client ID > say "2'. > - This subscriber with different cliend ID receives 5 messages that were > intended for the clientID "1". However, this does not mean that client ID "1" > will not receive the 5 messages when it comes back online. I noticed that > client ID "1" also received the 5 message. > Now that both clientID 1 and 2 received messages, subscribing a new clientID > doesn't receive these message. However, if we send 5 message again to the > topic and do not consume it for all clientIDs, it would delivered to any new > subscription. > For new client Id broker must create new session, so messages sent after > client 1 disconnected should route to client 1 only since client 2 because it > was connected after those 5 messages were sent (hence the new session of > client 2 shouldn't contain old messages). > Here are sample codes to reproduce: > The producer Python script > {code:python} > import paho.mqtt.client as mqttClient > import time > import ssl > # context = ssl.create_default_context() > Connected = False > broker_address= "localhost" > port = 1883 > user = "admin" > password = "admin" > def on_connect(client, userdata, flags, rc): > if rc == 0: > print("Connected to broker") > global Connected #Use global variable > Connected = True #Signal connection > else: > print("Connection failed") > client = mqttClient.Client(client_id="producer",transport="tcp") # > client.username_pw_set(user, password=password) #set username and password > client.on_connect=on_connect > # client.tls_set_context(context=context) > client.connect(broker_address, port=port) > client.loop_start() > i=0 > while True: > time.sleep(1) > i=i+1 > client.publish("test/data", "This is my test msg 123.",2,False) > print("Sent"+str(i)) > {code} > The consumer Python script > {code:python} > import paho.mqtt.client as mqttClient > import time > import ssl > Connected = False > broker_address= "localhost" > port = 1883 > user = "admin" > password = "admin" > def on_connect(client, userdata, flags, rc): > if rc == 0: > print("Connected to broker") > global Connected #Use global variable > Connected = True #Signal connection > print(flags) > client.subscribe("test/data",2) > else: > print("Connection failed") > def on_message(client, userdata, msg): > print(msg.topic+" "+str(msg.payload)) > client = > mqttClient.Client(client_id="id2",transport="tcp",clean_session=False) # > client.username_pw_set(user, password=password) #set username and password > client.on_connect=on_connect > client.on_message=on_message > # client.tls_set_context(context=context) > client.connect(broker_address, port=port) > client.loop_start() > while Connected != True: > time.sleep(0.1) > time.sleep(1000) > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@activemq.apache.org For additional commands, e-mail: issues-h...@activemq.apache.org For further information, visit: https://activemq.apache.org/contact