成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文讀懂通過工廠模式實現springboot+MQTT-訂閱與消費

開發 架構
在本文中,我們使用工廠模式實現了一個 MQTT 訂閱和消費的示例應用程序。我們使用 Eclipse Paho MQTT 客戶端庫來連接 MQTT 服務器,并訂閱指定的主題。

引言

Spring Boot 是一款用于構建基于 Spring 框架的快速應用程序的開源框架。它的目標是簡化 Spring 應用程序的開發和部署過程,Spring Boot 通過提供一些默認配置和自動配置,可以讓開發者更快的創建一個獨立的、產品級別的 Spring 應用程序。

MQTT 是一種輕量級的消息傳輸協議,它被設計用于 IoT(物聯網)中的低帶寬和不可靠的網絡環境中。MQTT 協議具有簡單、開銷小、可擴展等特點,非常適用于物聯網場景。

本文將介紹如何使用 Spring Boot 和 MQTT 實現訂閱與消費的功能,并通過工廠模式進行實現。

1、準備工作

在開始本文的實現過程之前,我們需要準備一些環境和工具。

(1)Spring Boot

首先,我們需要安裝和配置 Spring Boot。在這里,我們將使用 Spring Initializr 工具來快速創建一個 Spring Boot 項目。您可以訪問 https://start.spring.io/ 創建一個新的 Spring Boot 項目,也可以使用您自己的 IDE 或構建工具創建項目。

(2)MQTT

接下來,我們需要使用 MQTT 客戶端用來連接和通信 MQTT 服務器。在這里,我們將使用 Eclipse Paho MQTT 客戶端庫。您可以訪問
https://www.eclipse.org/paho/clients/java/ 下載 Eclipse Paho MQTT 客戶端庫。

(3)MQTT 服務器

最后,我們需要一個 MQTT 服務器。在這里,我們將使用 Eclipse Mosquitto 作為我們的 MQTT 服務器。您可以訪問 https://mosquitto.org/ 下載和安裝 Eclipse Mosquitto。

2、創建工廠類

我們將使用工廠模式來創建 MQTT 連接和訂閱的對象。我們將創建一個 MQTTFactory 類來管理 MQTT 連接和訂閱的對象。

(1) 創建 MQTTFactory 類

首先,我們創建一個 MQTTFactory 類。這個類將會是一個單例類,它將會負責管理 MQTT 連接和訂閱的對象。我們使用靜態塊來初始化 MQTT 連接。

public class MQTTFactory {
private static final String MQTT_SERVER_URL = "tcp://localhost:1883";
private static final String MQTT_CLIENT_ID = "mqtt-client";
private static final String MQTT_TOPIC = "mqtt-topic";

private static MqttClient mqttClient;

static {
try {
mqttClient = new MqttClient(MQTT_SERVER_URL, MQTT_CLIENT_ID);
mqttClient.connect();
} catch (MqttException e) {
e.printStackTrace();
}
}

private static MQTTFactory instance;

private MQTTFactory() {}

public static MQTTFactory getInstance() {
if (instance == null) {
instance = new MQTTFactory();
}
return instance;
}
}

在這個類中,我們定義了一些常量來設置 MQTT 服務器的地址、客戶端 ID 和訂閱的主題。在靜態塊中,我們使用 Eclipse Paho MQTT 客戶端庫創建了一個 MqttClient 對象,并連接到了 MQTT 服務器。在 getInstance() 方法中,我們使用懶漢式單例模式創建了一個 MQTTFactory 對象。

(2)創建 MQTTSubscriber 類

接下來,我們創建一個 MQTTSubscriber 類來訂閱 MQTT 主題。在 MQTTSubscriber 類中,我們定義了一個 subscribe() 方法,用于訂閱 MQTT 主題。

public class MQTTSubscriber {
private String topic;
private MqttClient mqttClient;

public MQTTSubscriber(String topic, MqttClient mqttClient) {
this.topic = topic;
this.mqttClient = mqttClient;
}

public void subscribe() throws MqttException {
mqttClient.subscribe(topic, new IMqttMessageListener() {
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println(String.format("Received message: %s from topic: %s", new String(message.getPayload()), topic));
}
});
}
}

在這個類中,我們使用構造方法來傳遞訂閱的主題和 MQTT 客戶端對象。在 subscribe() 方法中,我們使用 Eclipse Paho MQTT 客戶端庫的 subscribe() 方法來訂閱 MQTT 主題。在 messageArrived() 方法中,我們使用 System.out.println() 方法來打印收到的消息。

3、創建 Spring Boot 應用程序

接下來,我們創建一個 Spring Boot 應用程序,來測試我們實現的 MQTT 訂閱和消費的功能。

(1)創建 Spring Boot 應用程序

我們可以使用 Spring Initializr 工具創建一個新的 Spring Boot 應用程序。在這里,我們創建一個名為 "mqtt-subscriber" 的應用程序。我們添加了如下的依賴:

  • spring-boot-starter-web
  • eclipse-paho-mqtt-client

在 pom.xml 文件中,我們添加了如下的依賴:

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

這個依賴用于引入 Eclipse Paho MQTT 客戶端庫。

(2)創建 Spring Boot 控制器

我們創建一個名為 "MQTTSubscriberController" 的 Spring Boot 控制器。在這個控制器中,我們注入了一個 MQTTSubscriber 對象,并使用 @PostConstruct 注解來訂閱 MQTT 主題。

@RestController
public class MQTTSubscriberController {
private final MQTTSubscriber mqttSubscriber;

public MQTTSubscriberController(MQTTSubscriber mqttSubscriber) {
this.mqttSubscriber = mqttSubscriber;
}

@PostConstruct
public void init() {
try {
mqttSubscriber.subscribe();
} catch (MqttException e) {
e.printStackTrace();
}
}
}

在 init() 方法中,我們調用了 MQTTSubscriber 的 subscribe() 方法來訂閱 MQTT 主題。

(3)測試應用程序

現在,我們可以啟動應用程序并測試 MQTT 訂閱和消費的功能了。我們可以使用 Eclipse Mosquitto 的命令行客戶端來發布消息到訂閱的主題中。

在命令行中,我們可以使用以下命令來發布消息:

mosquitto_pub -t myTopic -m "Hello, World!"

在這個命令中,我們使用 "mosquitto_pub" 命令行客戶端來發布一條消息到 "myTopic" 主題中。消息內容為 "Hello, World!"。

如果一切正常,我們應該可以在控制臺中看到如下的輸出:

Received message: Hello, World! from topic: myTopic

這表明我們已經成功訂閱并消費了 MQTT 主題中的消息。

4、總結

在本文中,我們使用工廠模式實現了一個 MQTT 訂閱和消費的示例應用程序。我們使用 Eclipse Paho MQTT 客戶端庫來連接 MQTT 服務器,并訂閱指定的主題。我們還使用 Spring Boot 框架來創建應用程序,并使用 @PostConstruct 注解來訂閱 MQTT 主題。最后,我們使用 Eclipse Mosquitto 的命令行客戶端來發布消息到訂閱的主題中,并在控制臺中查看已消費的消息。

5、進一步改進

在實際的應用程序中,我們可能需要進一步改進我們的實現。以下是一些可能的改進方案:

(1)使用配置文件

在我們的示例應用程序中,我們硬編碼了 MQTT 服務器的地址、端口號、訂閱主題等信息。在實際的應用程序中,我們可能希望將這些信息放到配置文件中,以便在部署應用程序時能夠輕松地修改這些信息。

我們可以在 application.properties 或 application.yml 文件中添加以下內容:

mqtt.server.host=mqtt.example.com
mqtt.server.port=1883
mqtt.topic=myTopic

然后,我們可以在 MQTTFactory 類中讀取這些配置信息:

@Configuration
public class MQTTConfig {
@Value("${mqtt.server.host}")
private String mqttServerHost;

@Value("${mqtt.server.port}")
private int mqttServerPort;

@Value("${mqtt.topic}")
private String mqttTopic;

@Bean
public MqttClient mqttClient() throws MqttException {
String brokerUrl = String.format("tcp://%s:%d", mqttServerHost, mqttServerPort);
MqttClient mqttClient = new MqttClient(brokerUrl, MqttClient.generateClientId());
mqttClient.connect();
return mqttClient;
}

@Bean
public MQTTSubscriber mqttSubscriber() throws MqttException {
MqttClient mqttClient = mqttClient();
return new MQTTSubscriber(mqttTopic, mqttClient);
}

@Bean
public MQTTFactory mqttFactory() {
return MQTTFactory.getInstance();
}
}

現在,我們不再需要在代碼中硬編碼 MQTT 服務器的地址、端口號、訂閱主題等信息,而是從配置文件中讀取這些信息。

(2)使用注解

在我們的示例應用程序中,我們使用 @PostConstruct 注解來訂閱 MQTT 主題。在實際的應用程序中,我們可能希望使用更具有語義化的注解來標識哪些方法是用于訂閱 MQTT 主題的。

我們可以定義一個 @MQTTSubscriber 注解,并在需要訂閱 MQTT 主題的方法上使用該注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MQTTSubscriber {
}

然后,在 MQTTSubscriberController 類中,我們可以使用 @MQTTSubscriber 注解來標識訂閱 MQTT 主題的方法:

@RestController
public class MQTTSubscriberController {
private final MQTTSubscriber mqttSubscriber;

public MQTTSubscriberController(MQTTSubscriber mqttSubscriber) {
this.mqttSubscriber = mqttSubscriber;
}

@MQTTSubscriber
public void onMessage(String topic, String message) {
System.out.println(String.format("Received message: %s from topic: %s", message, topic));
}
}

在這個例子中,我們定義了一個名為 "onMessage" 的方法,并使用 @MQTTSubscriber 注解來標識該方法是用于訂閱 MQTT 主題的。在這個方法中,我們使用兩個參數來接收收到的消息的主題和內容。

在我們的應用程序啟動時,我們可以使用 Spring AOP 框架來自動掃描 @MQTTSubscriber 注解,并將被注解的方法注冊為 MQTT 主題的訂閱者。我們可以在 MQTTSubscriberAspect 類中實現這個功能:

@Aspect
@Component
public class MQTTSubscriberAspect {
private final MQTTSubscriber mqttSubscriber;

public MQTTSubscriberAspect(MQTTSubscriber mqttSubscriber) {
this.mqttSubscriber = mqttSubscriber;
}

@PostConstruct
public void subscribe() throws MqttException {
MqttClient mqttClient = mqttSubscriber.getMqttClient();
mqttClient.subscribe(mqttSubscriber.getTopic(), (topic, message) -> {
String payload = new String(message.getPayload(), StandardCharsets.UTF_8);
Object bean = mqttSubscriber.getBean();
Method[] methods = bean.getClass().getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(MQTTSubscriber.class) &&
method.getParameterCount() == 2 &&
method.getParameterTypes()[0].equals(String.class) &&
method.getParameterTypes()[1].equals(String.class)) {
method.setAccessible(true);
try {
method.invoke(bean, topic, payload);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
});
}
}

在這個類中,我們使用 Spring AOP 框架的 @Aspect 注解來標識該類是一個切面類。在 @PostConstruct 方法中,我們獲取 MQTT 訂閱者的 MqttClient 實例,并使用該實例訂閱指定的主題。然后,我們獲取被注解的方法,并遍歷這些方法,如果發現某個方法被標注為 @MQTTSubscriber,并且參數個數為 2,第一個參數為 String 類型,第二個參數也為 String 類型,則將該方法注冊為訂閱者。

現在,我們可以在任何需要訂閱 MQTT 主題的方法上使用 @MQTTSubscriber 注解,而不必再使用 @PostConstruct 注解。這使得我們的代碼更加具有語義化,并且更加容易閱讀和維護。

6、結論

在本文中,我們使用工廠模式實現了一個 MQTT 訂閱和消費的示例應用程序。我們使用 Eclipse Paho MQTT 客戶端庫來連接 MQTT 服務器,并訂閱指定的主題。我們還使用 Spring Boot 框架來創建應用程序,并使用 @PostConstruct 注解來訂閱 MQTT 主題。最后,我們介紹了使用配置文件和注解來改進我們的實現的方法。這些改進方案使我們的代碼更加具有語義化,并且更加容易閱讀和維護。

MQTT 是一種輕量級的消息傳遞協議,適用于物聯網等場景中的消息傳遞。它具有簡單、可靠、高效等特點,已經被廣泛應用于各種場景中。使用工廠模式和 Spring Boot 框架來實現 MQTT 訂閱和消費,可以使我們的代碼更加清晰和易于維護。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-09-21 16:56:16

設計模式微服務架構

2022-05-12 08:01:18

KubernetesDocker容器

2024-02-20 12:09:32

模式工廠方法接口

2023-12-22 19:59:15

2021-08-04 16:06:45

DataOps智領云

2023-03-03 08:26:32

負載均衡算法服務

2022-10-28 13:38:40

ServiceLinkerd服務網格

2023-07-19 08:46:00

導航地圖

2022-09-22 09:00:46

CSS單位

2025-04-03 10:56:47

2018-09-28 14:06:25

前端緩存后端

2022-11-06 21:14:02

數據驅動架構數據

2022-03-24 17:56:51

數據平臺觀測

2022-12-08 14:18:45

2021-08-11 10:10:26

Linux定時器數組

2022-10-20 08:01:23

2023-11-27 17:35:48

ComponentWeb外層

2022-12-01 17:23:45

2021-12-29 18:00:19

無損網絡網絡通信網絡

2022-07-26 00:00:03

語言模型人工智能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久一区二区 | 免费黄篇 | 亚洲国产精品日韩av不卡在线 | 一区二区精品 | 免费a网站 | 最新毛片网站 | 99riav国产一区二区三区 | 日韩久久中文字幕 | 久久久精品久久久 | 久久9久| 一区在线视频 | 日本一区二区高清不卡 | 一区免费视频 | 欧美一区2区三区4区公司二百 | 一区在线观看 | 一级在线免费观看 | 国产精品久久久久久婷婷天堂 | 香蕉久久久 | 亚洲精品在线观 | 亚洲精品白浆高清久久久久久 | www.亚洲区 | 日韩免费视频一区二区 | www.4hu影院| 日本小电影在线 | 久久久久国产一级毛片高清网站 | 大学生a级毛片免费视频 | 黄色一级毛片免费看 | 91免费福利视频 | 日日摸夜夜添夜夜添精品视频 | 国产资源在线播放 | 精品欧美一区二区三区久久久小说 | 91免费看片| 91久久久久久久久久久 | 欧美一区视频 | 一级看片免费视频囗交动图 | 日韩高清中文字幕 | 毛片一级黄色 | 亚洲午夜久久久 | 日韩精品成人 | 国产精品自拍视频网站 | 久久久久久久久久久久亚洲 |