2014-01-21 5 views
2

저는 Mqtt을 사용하기 시작했습니다. 신뢰할 수없는 네트워크를 처리하는 데 어려움이 있습니다. Poho Java 클라이언트 (그루비 있음)를 사용하여 먼 Mosquitto Broker에 메시지를 게시하고 있습니다.Mqtt Paho - 브로커에 연결할 수없는 동안 게시하려고 시도합니다.

브로커에 연결할 수없는 경우 Paho 클라이언트가 메시지를 유지하고 브로커에 자동으로 다시 연결하여 로컬로 저장된 메시지를 게시하는 방법이 있습니까? 예를 들어 지역 중개인을 사용하여 모든 것을 직접 처리해야합니까? 여기

내 클라이언트 건물 코드

String persistenceDir = config['persistence-dir'] ?: System.getProperty('java.io.tmpdir') 
    def persistence = new MqttDefaultFilePersistence(persistenceDir) 
    client = new MqttAsyncClient(uri, clientId, persistence) 
    client.setCallback(this) 
    options = new MqttConnectOptions() 
    if (config.password) { 
     options.setPassword(config.password as char[]) 
     options.setUserName(config.user) 
    } 
    options.setCleanSession(false) 
    client.connect(options) 

그리고 내 게시 코드

def message = new MqttMessage(Json.encode(outgoingMessage).getBytes()) 
    try { 
    client?.connect(options) 
    def topic = client.getTopic('processMsg') 
    message.setQos(1) 
    def token = topic.publish(message) 
    if (client) { 
     client.disconnect() 
    } 

감사

답변

2

가 브로커에 연결되어있을 때 PAHO 클라이언트는 기내 메시지를 지속됩니다 볼 수있는 로컬 브로커를 사용하려는 경우. 연결 문제는 메시지가

터지는 타임 아웃 볼 수 있습니다 도착하기 시작 일반적으로

,
  • 그 시점에서 서버 (32000)

에서 응답을 기다리는 동안 제한 시간을 초과 메시지 것이다 여전히 지속됩니다.

그러나, 연결이 끊어되며,이

  • 클라이언트 (32104)

당신은 메시지를 PAHO에 의해 지속되지 않았 음을 가정한다 연결되지 않은보고 시작할 때.

당신은 org.eclipse.paho.client.mqttv3.internal.ClientComms이를 디버깅 할 수 있습니다 :

/** 
* Sends a message to the broker if in connected state, but only waits for the message to be 
* stored, before returning. 
*/ 
public void sendNoWait(MqttWireMessage message, MqttToken token) throws MqttException { 
    final String methodName = "sendNoWait"; 
    if (isConnected() || 
      (!isConnected() && message instanceof MqttConnect) || 
      (isDisconnecting() && message instanceof MqttDisconnect)) { 
     this.internalSend(message, token); 
    } else { 
     //@TRACE 208=failed: not connected 
     log.fine(className, methodName, "208"); 
     throw ExceptionHelper.createMqttException(MqttException.REASON_CODE_CLIENT_NOT_CONNECTED); 
    } 
} 

internalSend 메시지를 계속하지만,이 브로커에 연결되어있는 경우에만 가능합니다.

또한 Paho가 처리 할 수있는 기내 메시지의 최대 개수가 있다는 점을 고려하십시오. 초과하는 경우 메시지를 지속하지 않기로 결정합니다.

0

로컬 브로커를 설정하고 원격 브로커와 브리지 할 수 있습니다. 그렇게하면 로컬에서 모든 메시지를 큐에 넣을 수 있고 원격 브로커가 온라인으로 돌아 왔을 때 모든 메시지를 전달할 수 있습니다.

관련 문제