![](/img/trans.png)
[英]How is the correct way to receive messages using MQTT (paho) + activeMQ?
[英]Cannot receive already published messages to subscribed topic on mqtt paho
我正在使用paho發送和接收mqtt消息。 到目前為止,發送消息沒有問題。 我收到它們有問題。我的代碼是:
package BenchMQTT;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttClient;
public class Test_A_2 implements MqttCallback {
MqttClient clientR;
MqttClient clientS;
public Test_A_2() {
}
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
new Test_A_2().doDemo();
long endTime = System.currentTimeMillis();
}
public void doDemo() throws InterruptedException {
try {
clientS = new MqttClient("tcp://mybroker:1883", "Sender");
clientR = new MqttClient("tcp://mybroker:1883", "Reiever");
clientR.connect();
clientS.connect();
MqttMessage message = new MqttMessage();
String messagePayload = "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjk"
+ "lzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghj"
+ "klzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfgh"
+ "jklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfg"
+ "hjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasd"
+ "fghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopas"
+ "dfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopa"
+ "sdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiop"
+ "asdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuio"
+ "pasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyui"
+ "opasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyu"
+ "iopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwerty"
+ "uiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwert"
+ "nmqwertyuiop";
clientR.subscribe("BenchMQTT");
clientR.setCallback(this);
for(int i=0;i<10;i++)
{
message.setPayload((messagePayload)
.getBytes());
System.out.println(i);
clientS.publish("BenchMQTT", message);
}
clientR.disconnect();
clientS.disconnect();
clientR.close();
clientS.close();
} catch (MqttException e)
{
System.out.println("ERROR");
}
}
@Override
public void connectionLost(Throwable cause) {
// TODO Auto-generated method stub
}
@Override
public void messageArrived(String topic, MqttMessage message)
{
System.out.println("Received: " + message.toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
}
這發送和接收消息。
OUTPUT:
0
Received: 0
1
Received: 1
2
Received: 2
3
Received: 3
4
Received: 4
5
Received: 5
6
Received: 6
7
Received: 7
8
Received: 8
9
Received: 9
我想發送消息,然后收到它們。 有幫助嗎? 預期產量:
0
1
2
3
4
5
6
7
8
9
Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
Received: 6
Received: 7
Received: 8
Received: 9
這不是MQTT(或任何發布/訂閱消息)的工作原理,如果接收者連接到服務器,則消息將在發送時傳遞。
例外情況是,如果接收器連接並訂閱了大於0的QOS主題,則稍后斷開連接並重新連接(不使用干凈的會話標志集),那么已發布的QOS大於0的錯過消息將被傳遞在重新連接點。
另一種可能性是,如果消息已發布且保留標志設置為true,則只有發布到主題的最后一條消息將在接收客戶端訂閱時傳遞。
以下代碼執行您想要的操作,但它強制MQTT以不應該的方式運行。 消息隊列僅用於確保將所有消息傳遞到客戶端,即使它在一段時間內斷開連接,也始終會盡快傳遞消息。
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttClient;
public class Test_A_2 implements MqttCallback {
MqttClient clientR;
MqttClient clientS;
public Test_A_2() {
}
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
new Test_A_2().doDemo();
long endTime = System.currentTimeMillis();
}
public void doDemo() throws InterruptedException {
try {
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
clientS = new MqttClient("tcp://localhost:1883", "Sender");
clientR = new MqttClient("tcp://localhost:1883", "Reiever");
clientR.connect(options);
clientS.connect();
clientR.setCallback(this);
clientR.subscribe("BenchMQTT",2);
MqttMessage message = new MqttMessage();
String messagePayload = "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjk"
+ "lzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghj"
+ "klzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfgh"
+ "jklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasdfg"
+ "hjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopasd"
+ "fghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopas"
+ "dfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiopa"
+ "sdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuiop"
+ "asdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyuio"
+ "pasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyui"
+ "opasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwertyu"
+ "iopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwerty"
+ "uiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnmqwert"
+ "nmqwertyuiop";
clientR.disconnect();
for(int i=0;i<10;i++)
{
message.setPayload((messagePayload)
.getBytes());
System.out.println(i);
message.setQos(2);
clientS.publish("BenchMQTT", message);
}
clientR.connect(options);
clientR.setCallback(this);
clientR.subscribe("BenchMQTT",2);
clientR.disconnect();
clientS.disconnect();
clientR.close();
clientS.close();
} catch (MqttException e)
{
System.out.println("ERROR");
e.printStackTrace();
}
}
@Override
public void connectionLost(Throwable cause) {
// TODO Auto-generated method stub
}
@Override
public void messageArrived(String topic, MqttMessage message)
{
System.out.println("Received: " + message.toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.