mqtt 进行生产,订阅消息,踩坑日记

话不多说直接上代码:

生产者:

回调函数

/**
 * MQTT 推送回调
 *
 * @author wunaozai
 * @date 2018-08-22
 */
public class MqttPushCallback implements MqttCallback {

    private static final Logger log = LoggerFactory.getLogger(MqttPushCallback.class);

    @Override
    public void connectionLost(Throwable cause) {
        //log.info("断开连接,建议重连" + this);
        //断开连接,建议重连
//        new MqttPushClient();
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        //log.info("推送完成" + token.getMessage());
        log.info("推送完成" + token.isComplete() + "");
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) {
        log.info("Topic: " + topic);
    }

}
    private static final Logger log = LoggerFactory.getLogger(MqttPushClient.class);
    public static String MQTT_HOST = "tcp://114.116.90.167:1883";
    public static String MQTT_CLIENTID = "client_id";
    public static String MQTT_USERNAME = "user"; //admin
    public static String MQTT_PASSWORD = "user65789"; //admin53421
    public static int MQTT_TIMEOUT = 10;
    public static int MQTT_KEEPALIVE = 10;

    private MqttClient client;
    private static volatile MqttPushClient mqttClient = null;
    public static MqttPushClient getInstance() {
        if(mqttClient == null) {
            synchronized (MqttPushClient.class) {
                if(mqttClient == null) {
                    mqttClient = new MqttPushClient();
                }
            }
        }
        return mqttClient;
    }

    public MqttPushClient() {
        log.info("Connect MQTT: " + this);
        connect();
    }

    public void connect() {
        try {
            client = new MqttClient(MQTT_HOST, MQTT_CLIENTID, new MemoryPersistence());
            MqttConnectOptions option = new MqttConnectOptions();
            option.setCleanSession(false);
            option.setUserName(MQTT_USERNAME);
            option.setPassword(MQTT_PASSWORD.toCharArray());
            option.setConnectionTimeout(MQTT_TIMEOUT);
            option.setKeepAliveInterval(MQTT_KEEPALIVE);
            option.setAutomaticReconnect(true);
            try {
                client.setCallback(new MqttPushCallback());
                client.connect(option);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 发布主题,用于通知<br>
     * 默认qos为1 非持久化   retined:false 非持久化   true  持久化
     * @param topic
     * @param data
     */
    public void publish(String topic, String data) {
        publish(topic, data, 1, false);
    }
    /**
     * 发布
     * @param topic
     * @param data
     * @param qos
     * @param retained
     */
    public void publish(String topic, String data, int qos, boolean retained) {
        MqttMessage message = new MqttMessage();
        message.setQos(qos);
        message.setRetained(retained);
        message.setPayload(data.getBytes());
        MqttTopic mqttTopic = client.getTopic(topic);

        if(null == mqttTopic) {
            log.error("Topic Not Exist");
        }
        MqttDeliveryToken token;
        try {
            token = mqttTopic.publish(message);
            token.waitForCompletion();
            log.info("MQTT推送消息成功,message is:[{}]",message);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 订阅某个主题 qos默认为1
     * @param topic
     */
    public void subscribe(String topic) {
        subscribe(topic, 2);
    }

    /**
     * 订阅某个主题
     * @param topic
     * @param qos
     */
    public void subscribe(String topic, int qos) {
        log.info("接受到的消息是————————》》》"+"2222222222222222222222");
        try {
            log.info("接受到的消息是————————》》》"+"111111111111111111");
            log.info("接受到的消息是————————》》》"+client);
            log.info("接受到的消息是————————》》》"+client.getClientId());
            //client.subscribe(topic, qos);
            //IMqttToken token = client.subscribeWithResponse(topic,qos);
            //String msg = String.valueOf(token.getResponse().getPayload());
            client.subscribe(topic, 2);
//            client.subscribe(topic, 2, new IMqttMessageListener() {
//                @Override
//                public void messageArrived(String topic, MqttMessage message) throws Exception {
//                    log.info("接受到的消息是————————》》》333333333");
//                    log.info("接受到的消息是————————》》》"+new String(message.getPayload()));
//                }
//            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 清空主题
     */
    public void cleanTopic(String topic) {
        if (null != client || client.isConnected()) {
            try {
                client.unsubscribe(topic);
            } catch (MqttException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
            log.info("mqttClient is error");
        }
    }

}

消费者:

/**
 * Active mq 服务端,消费
 * @author pengheng
 * @create 2020-06-02
 **/
@Component
public class Topic_Consumer implements ApplicationRunner {

    private static final Logger log = LoggerFactory.getLogger(Topic_Consumer.class);

    public static String MQTT_USERNAME = "user"; //admin
    public static String MQTT_PASSWORD = "user65789"; //admin53421

    @Autowired
    public BsAppAccountService bsAppAccountService;

    @Autowired
    private XinGePushService xinGePushService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        init();
    }

    public void init() throws JMSException {
        ConnectionFactory factory = new ActiveMQConnectionFactory(
//                ActiveMQConnectionFactory.DEFAULT_USER,
//                ActiveMQConnectionFactory.DEFAULT_PASSWORD,
                MQTT_USERNAME,
                MQTT_PASSWORD,
                "tcp://114.116.90.167:61616"
        );
        Connection conn = factory.createConnection();
//        conn.setClientID("consumer1");
        conn.start();

        Session session = conn.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        //与生产者的消息目的地相同
        Destination dest = session.createTopic(ContentPrefixConst.getMerchantAppUserIdentity());

        MessageConsumer messConsumer = session.createConsumer(dest);

        messConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message m) {
                try{
                    if(m instanceof TextMessage){ //接收文本消息
                        TextMessage message = (TextMessage)m;
                        log.info(message.getText());
                    }else if(m instanceof MapMessage){ //接收键值对消息
                        MapMessage message = (MapMessage)m;
                        log.info(">>"+message.getLong("age"));
                        log.info(">>"+message.getDouble("sarray"));
                        log.info(message.getString("username"));
                    }else if(m instanceof StreamMessage){ //接收流消息
                        StreamMessage message = (StreamMessage)m;
                        log.info(message.readString());
                        log.info(">>"+message.readLong());
                    }else if(m instanceof BytesMessage){ //接收字节消息
                        byte[] b = new byte[1024];
                        int len = -1;
                        BytesMessage message = (BytesMessage)m;
                        StringBuffer buffer = new StringBuffer();
                        while((len=message.readBytes(b))!=-1){
                            log.info(" =============================>pz =============================>");
                            log.info(new String(b, 0, len));
                            buffer.append(new String(b, 0, len));
                        }
                        pushXingge(buffer.toString());
                    }

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

    /**
     * 推送到xingge
     * @param
     * @param
     */
    public void pushXingge(String message){
        JSONObject object = FastJsonUtils.getStringToJson(message);
        String merchantId = object.getString("merchantId");
        String title = object.getString("title");
        String content = object.getString("content");
        String id = object.getString("id");
        String type = object.getString("type");

        Map tmAppMap = bsAppAccountService.selectTmappCount(merchantId);
        if (null != tmAppMap) {
            if (StringUtils.isNotBlank(String.valueOf(tmAppMap.get("d_token")))) {
                String token = String.valueOf(tmAppMap.get("d_token"));
                log.info("信鸽推送消息查到的token:" + token);
                if (StringUtils.isNotBlank(token)) {
                    String d_type = String.valueOf(tmAppMap.get("d_type"));
                    ArrayList<String> token_list = new ArrayList<>();
                    token_list.add(token);
                    //要打开的页面调/payment/waterEleReadPayment
                    xinGePushService.pushSingleDevice(token_list, d_type, title, content, id, type);
                }
            }
        }
        log.info("active mq 渠道推送结束");
    }
}

 

注意:

tcp://localhost:8161(管理端口)  

tcp://127.0.0.1:61616(服务端口)

端口不弄错了哦!

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值