2016-12-05 4 views
0

私はインターネット上で探してきました。私は清掃 "偽"とqos 1と2を設定しようとしましたが、加入者はオンラインになるとすべてのコンテンツを取得していません。 助けてください...私のコードはサブスクライバがMqttトピックで非アクティブなときにプロデューサによって送信されたすべてのデータを取得する方法Java(保持されていないメッセージまたは最後のメッセージ)

Example.java(プロデューサー)

public class Example extends PersonBean { 
public void hey(){ 
String clientId = MqttClient.generateClientId(); 
MemoryPersistence persistence = new MemoryPersistence(); 

    PersonBean pb=new PersonBean(); 
    for(int i=1;i<=5;i++){ 
     Gson gson = new Gson(); 

     Date dt=new Date(); 
     DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     String currentTime = df.format(dt); 
    pb.setId(i); 
    pb.setName("sai"); 
    pb.setEmail("[email protected]"); 
    pb.setAddress("hyderabad"); 
    pb.setCreatedOn(currentTime); 


    String jsonInString = gson.toJson(pb); 


     try { 
      String broker = "tcp://localhost:1883"; 
      String topicName = "test/mqtt"; 
      int qos = 2; 

    MqttClient mqttClient = new MqttClient(broker,clientId); 
      MqttConnectOptions connOpts = new MqttConnectOptions(); 
      connOpts.setCleanSession(false); 
      mqttClient.connect(connOpts); 

      MqttMessage message = new MqttMessage(jsonInString.getBytes()); 

      message.setQos(qos); 
    message.setRetained(true); 


      MqttTopic topic2 = mqttClient.getTopic(topicName); 
topic2.publish(message); 

     mqttClient.disconnect(); 
     } catch (MqttException me) { 
      System.out.println("reason " + me.getReasonCode() + " - msg " 
        + me.getMessage() + "- loc " + me.getLocalizedMessage() 
        + " - cause " + me.getCause() + "- exception " + me); 

     } 


    }} 

    public static void main(String[] args) { 
    Example ex=new Example(); 
    ex.hey(); 
}} 

と私の

Subscriber.java

public class SubcriberExample implements MqttCallback{ 

MqttClient client; 
public void doDemo() { 
    try { 
     client = new MqttClient("tcp://192.168.4.189:1883", "Sending"); 
     client.connect(); 
     client.setCallback(this); 
     client.subscribe("test/mqtt"); 



    } catch (MqttException e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String args[]){ 
    SubcriberExample se=new SubcriberExample(); 
    se.doDemo(); 
} 

@Override 
public void connectionLost(Throwable arg0) { 
    // TODO Auto-generated method stub 
    System.out.println("connection lost...."); 
} 

@Override 
public void deliveryComplete(IMqttDeliveryToken arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void messageArrived(String topic, MqttMessage message) throws Exception { 
    // TODO Auto-generated method stub 
    System.out.println("message is : "+message); 
}} 

答えて

3

あなたは上だです適切なトラックであれば、公表されたメッセージは保留に適格であるためにはQoS1/2であることが要求されるオフラインキュー(オフラインサブスクライバの場合)に格納されます。

しかし、上記のコードから問題が加入者にあるようです。 MQTT加入者がオフライン・メッセージを受信できるようにするには、永続セッションが必要です。私。加入者はclean session = falseで接続する必要があります。

+0

返信いただきありがとうございます。私はクライアント=新しいMqttClient( "tcp://192.168.4.189:1883"、 "送信")を追加しました。 \t MqttConnectOptions mqOptions = new MqttConnectOptions(); \t mqOptions.setCleanSession(false); \t client.connect(mqOptions); \t client.subscribe( "test/mqtt"); \t client.setCallback(this); – Sai

+0

私は加入者がQoS 1/2で加入する必要があると思います。それ以外の場合、QoSはQoS 0にダウングレードされます(クライアントではデフォルトになっていると思います)。メッセージは保存されません。 –

+0

Javaで小さな例がありますか?してください – Sai

関連する問題