/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package net.acesinc.data.json.generator.log; import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; /** * Created by ygalblum on 11/24/16. */ public class MqttLogger implements EventLogger { private static final Logger log = LogManager.getLogger(MqttLogger.class); /* Constants fpr Properties names */ private static final String PRODUCER_TYPE_NAME = "mqtt"; private static final String BROKER_SERVER_PROP_NAME = "broker.server"; private static final String BROKER_PORT_PROP_NAME = "broker.port"; private static final String TOPIC_PROP_NAME = "topic"; private static final String CLIENT_ID_PROP_NAME = "clientId"; private static final String QOS_PROP_NAME = "qos"; private static final String USERNAME_PROP_NAME = "username"; private static final String PASSWORD_PROP_NAME = "password"; /* Constants for default values */ private static final String DEFAULT_CLIENT_ID = "JsonGenerator"; private static final int DEFAULT_QOS = 2; /* Instance properties */ private final MqttClient mqttClient; private final String topic; private final int qos; public MqttLogger(Map<String, Object> props) throws MqttException { String brokerHost = (String) props.get(BROKER_SERVER_PROP_NAME); Integer brokerPort = (Integer) props.get(BROKER_PORT_PROP_NAME); String brokerAddress = brokerHost + ":" + brokerPort.toString(); String clientId = (String) props.get(CLIENT_ID_PROP_NAME); String username = (String)props.get(USERNAME_PROP_NAME); String password = (String)props.get(PASSWORD_PROP_NAME); topic = (String) props.get(TOPIC_PROP_NAME); Integer _qos = (Integer) props.get(QOS_PROP_NAME); qos = null == _qos ? DEFAULT_QOS : _qos; mqttClient = new MqttClient(brokerAddress, null == clientId ? DEFAULT_CLIENT_ID : clientId); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); if (null != username) { connOpts.setUserName(username); if (null != password) { connOpts.setPassword(password.toCharArray()); } } log.debug("Connecting to broker: "+brokerAddress); mqttClient.connect(connOpts); log.debug("Connected"); } @Override public void logEvent(String event, Map<String, Object> producerConfig) { String _topic = null; Integer _qos = null; Object value = producerConfig.get(PRODUCER_TYPE_NAME); if (null != value && Map.class.isAssignableFrom(value.getClass())) { Map<String, Object> config = (Map<String, Object>) value; _topic = (String) config.get(TOPIC_PROP_NAME); _qos = (Integer) config.get(QOS_PROP_NAME); } logEvent(event, null == _topic ? topic : _topic, null == _qos ? qos : _qos); } /** * * @param event the value of event * @param qos the value of qos * @param topic the value of topic */ private void logEvent(String event, String topic, int qos) { MqttMessage message = new MqttMessage(event.getBytes()); message.setQos(qos); try { mqttClient.publish(topic, message); log.debug("Message published"); } catch (MqttException ex) { log.error("Failed to publish message", ex); } } @Override public void shutdown() { if (null != mqttClient) { try { mqttClient.disconnect(); System.out.println("Disconnected"); } catch (MqttException ex) { log.error("Error in disconnect", ex); } } } }