/* * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.wso2.carbon.inbound.endpoint.protocol.mqtt; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.paho.client.mqttv3.IMqttToken; import org.eclipse.paho.client.mqttv3.MqttAsyncClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import java.util.Properties; import java.util.concurrent.Semaphore; /** * Connection consumer for MQTT listener which delegates connection attempts and subscription * from the MQTT inbound listener */ public class MqttConnectionConsumer { private static final Log log = LogFactory.getLog(MqttConnectionConsumer.class); private MqttAsyncClient mqttAsyncClient; private MqttConnectOptions connectOptions; private MqttConnectionFactory confac; private Properties mqttProperties; private MqttConnectionListener connectionListener; private String name; public MqttConnectionConsumer(MqttConnectOptions connectOptions, MqttAsyncClient mqttAsyncClient, MqttConnectionFactory confac, Properties mqttProperties, String name) { this.name = name; this.connectOptions = connectOptions; this.mqttAsyncClient = mqttAsyncClient; this.confac = confac; this.mqttProperties = mqttProperties; } public void execute() { if (mqttAsyncClient != null) { if (mqttAsyncClient.isConnected()) { //do nothing just return //this is a case for manually tenant loading case //as we maintain connection when the tenant is manually loaded ( no connection //disconnect and reconnect ) return; } else { try { connectionListener = new MqttConnectionListener(this); IMqttToken token = mqttAsyncClient.connect(connectOptions); token.waitForCompletion(); if (!mqttAsyncClient.isConnected()) { connectionListener.onFailure(); } if (mqttAsyncClient.isConnected()) { int qosLevel = Integer.parseInt(mqttProperties .getProperty(MqttConstants.MQTT_QOS)); if (confac.getTopic() != null) { mqttAsyncClient.subscribe(confac.getTopic(), qosLevel); } log.info("MQTT inbound endpoint " + this.name + " connected to the broker"); } } catch (MqttException ex) { log.error("Error while trying to subscribe to the remote ", ex); connectionListener.onFailure(); } } } } public void shutdown() { if (connectionListener != null) { this.connectionListener.shutdown(); } } public MqttConnectOptions getConnectOptions() { return connectOptions; } public MqttAsyncClient getMqttAsyncClient() { return mqttAsyncClient; } public MqttConnectionFactory getMqttConnectionFactory() { return confac; } public Properties getMqttProperties() { return mqttProperties; } public String getName() { return this.name; } }