activemq - mqttv3

相比于 mqtt-client,mqttv3 使用的人相对多些,如果出现问题,好排查一些。

activemq 部署 MQTT 服务

查看文件:conf\activemq.xml,

如果包含下面内容,activemq 本身已经包含 MQTT 服务,不需要任何其它配置。

activemq 不局限于下面这些,还可以继续扩展,比如:NIO、SSL。

前往官网查看:https://activemq.apache.org/components/classic/documentation/auto

<transportConnectors>
	<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
	<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

Maven 依赖

<dependency>
	<groupId>org.eclipse.paho</groupId>
	<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
	<version>1.2.5</version>
</dependency>

关键参数

CleanSession 清除会话

设置为 false 之后,在 client 断线恢复之后,能接收到期间错过的消息。

注意磁盘空间和会话保持时间,避免磁盘空间不足,或者超时自动清除。

Qos 服务质量

  • QoS 0:最多一次传输,消息可能会丢失。
  • QoS 1:至少一次传输,消息可能会重复。
  • QoS 2:仅一次传输,确保消息不会重复也不会丢失。

消息保留 retain

服务器会保留最新的一条 retain 值为 true 的消息(只有最后一条);

‌这个机制,可以确保当客户端连接到 MQTT 服务器时,可以立即获取队列最新状态。‌

代码样例

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;

/**
 * 发送 MQTT 消息
 *
 * @author Mr.css
 * @version 2024-10-15 9:16
 */
public class MqttPublish {

    public static void main(String[] args) throws Exception {
        try {
            String topic = "mqtt";
            String broker = "tcp://localhost:1883";
            String clientId = "MqttPublish";

            MqttClient client = new MqttClient(broker, clientId);

            // 使用自定义参数连接
            MqttConnectOptions options = new MqttConnectOptions();
            options.setUserName("dev");
            options.setPassword("dev".toCharArray());
            options.setConnectionTimeout(60);
            options.setKeepAliveInterval(60);
			
			// 是否清理会话,这个配置非常重要,置为 false,client 可以获取到断线期间的消息
            options.setCleanSession(false);
            client.connect(options);

            String content = "Hello MQTT";
            MqttMessage message = new MqttMessage(content.getBytes());
            message.setQos(2);
            message.setRetained(false);

            client.publish(topic, message);
            System.out.println("send: " + message);

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


import org.eclipse.paho.client.mqttv3.*;

/**
 * 接收 MQTT 消息
 *
 * @author Mr.css
 * @version 2024-10-15 9:16
 */
public class MQTTReceiver implements MqttCallback {
    public static void main(String[] args) {
        try {
            String topic = "mqtt";
            String broker = "tcp://localhost:1883";
            String clientId = "MQTTReceiver";

            MqttClient client = new MqttClient(broker, clientId);
            MqttCallback callback = new MQTTReceiver();

            client.setCallback(callback);


            // 使用自定义参数连接
            MqttConnectOptions options = new MqttConnectOptions();
            options.setUserName("dev");
            options.setPassword("dev".toCharArray());
            options.setConnectionTimeout(60);
            options.setKeepAliveInterval(60);
            client.connect(options);

            int qos = 2;
            client.subscribe(topic, qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void connectionLost(Throwable cause) {
        // 当连接丢失时调用
        System.out.println("Connection lost");
        cause.printStackTrace();
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // 当接收到消息时调用
        System.out.println("Message arrived: " + new String(message.getPayload()));
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        // 当消息发送成功时调用
        System.out.println("Delivery complete");
    }
}

posted on 2024-11-04 09:12  疯狂的妞妞  阅读(2)  评论(0编辑  收藏  举报

导航