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

一文讀懂通過(guò)工廠模式實(shí)現(xiàn)springboot+MQTT-訂閱與消費(fèi)

開發(fā) 架構(gòu)
在本文中,我們使用工廠模式實(shí)現(xiàn)了一個(gè) MQTT 訂閱和消費(fèi)的示例應(yīng)用程序。我們使用 Eclipse Paho MQTT 客戶端庫(kù)來(lái)連接 MQTT 服務(wù)器,并訂閱指定的主題。

引言

Spring Boot 是一款用于構(gòu)建基于 Spring 框架的快速應(yīng)用程序的開源框架。它的目標(biāo)是簡(jiǎn)化 Spring 應(yīng)用程序的開發(fā)和部署過(guò)程,Spring Boot 通過(guò)提供一些默認(rèn)配置和自動(dòng)配置,可以讓開發(fā)者更快的創(chuàng)建一個(gè)獨(dú)立的、產(chǎn)品級(jí)別的 Spring 應(yīng)用程序。

MQTT 是一種輕量級(jí)的消息傳輸協(xié)議,它被設(shè)計(jì)用于 IoT(物聯(lián)網(wǎng))中的低帶寬和不可靠的網(wǎng)絡(luò)環(huán)境中。MQTT 協(xié)議具有簡(jiǎn)單、開銷小、可擴(kuò)展等特點(diǎn),非常適用于物聯(lián)網(wǎng)場(chǎng)景。

本文將介紹如何使用 Spring Boot 和 MQTT 實(shí)現(xiàn)訂閱與消費(fèi)的功能,并通過(guò)工廠模式進(jìn)行實(shí)現(xiàn)。

1、準(zhǔn)備工作

在開始本文的實(shí)現(xiàn)過(guò)程之前,我們需要準(zhǔn)備一些環(huán)境和工具。

(1)Spring Boot

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

(2)MQTT

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

(3)MQTT 服務(wù)器

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

2、創(chuàng)建工廠類

我們將使用工廠模式來(lái)創(chuàng)建 MQTT 連接和訂閱的對(duì)象。我們將創(chuàng)建一個(gè) MQTTFactory 類來(lái)管理 MQTT 連接和訂閱的對(duì)象。

(1) 創(chuàng)建 MQTTFactory 類

首先,我們創(chuàng)建一個(gè) MQTTFactory 類。這個(gè)類將會(huì)是一個(gè)單例類,它將會(huì)負(fù)責(zé)管理 MQTT 連接和訂閱的對(duì)象。我們使用靜態(tài)塊來(lái)初始化 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;
}
}

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

(2)創(chuàng)建 MQTTSubscriber 類

接下來(lái),我們創(chuàng)建一個(gè) MQTTSubscriber 類來(lái)訂閱 MQTT 主題。在 MQTTSubscriber 類中,我們定義了一個(gè) 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));
}
});
}
}

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

3、創(chuàng)建 Spring Boot 應(yīng)用程序

接下來(lái),我們創(chuàng)建一個(gè) Spring Boot 應(yīng)用程序,來(lái)測(cè)試我們實(shí)現(xiàn)的 MQTT 訂閱和消費(fèi)的功能。

(1)創(chuàng)建 Spring Boot 應(yīng)用程序

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

  • 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>

這個(gè)依賴用于引入 Eclipse Paho MQTT 客戶端庫(kù)。

(2)創(chuàng)建 Spring Boot 控制器

我們創(chuàng)建一個(gè)名為 "MQTTSubscriberController" 的 Spring Boot 控制器。在這個(gè)控制器中,我們注入了一個(gè) MQTTSubscriber 對(duì)象,并使用 @PostConstruct 注解來(lái)訂閱 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() 方法中,我們調(diào)用了 MQTTSubscriber 的 subscribe() 方法來(lái)訂閱 MQTT 主題。

(3)測(cè)試應(yīng)用程序

現(xiàn)在,我們可以啟動(dòng)應(yīng)用程序并測(cè)試 MQTT 訂閱和消費(fèi)的功能了。我們可以使用 Eclipse Mosquitto 的命令行客戶端來(lái)發(fā)布消息到訂閱的主題中。

在命令行中,我們可以使用以下命令來(lái)發(fā)布消息:

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

在這個(gè)命令中,我們使用 "mosquitto_pub" 命令行客戶端來(lái)發(fā)布一條消息到 "myTopic" 主題中。消息內(nèi)容為 "Hello, World!"。

如果一切正常,我們應(yīng)該可以在控制臺(tái)中看到如下的輸出:

Received message: Hello, World! from topic: myTopic

這表明我們已經(jīng)成功訂閱并消費(fèi)了 MQTT 主題中的消息。

4、總結(jié)

在本文中,我們使用工廠模式實(shí)現(xiàn)了一個(gè) MQTT 訂閱和消費(fèi)的示例應(yīng)用程序。我們使用 Eclipse Paho MQTT 客戶端庫(kù)來(lái)連接 MQTT 服務(wù)器,并訂閱指定的主題。我們還使用 Spring Boot 框架來(lái)創(chuàng)建應(yīng)用程序,并使用 @PostConstruct 注解來(lái)訂閱 MQTT 主題。最后,我們使用 Eclipse Mosquitto 的命令行客戶端來(lái)發(fā)布消息到訂閱的主題中,并在控制臺(tái)中查看已消費(fèi)的消息。

5、進(jìn)一步改進(jìn)

在實(shí)際的應(yīng)用程序中,我們可能需要進(jìn)一步改進(jìn)我們的實(shí)現(xiàn)。以下是一些可能的改進(jìn)方案:

(1)使用配置文件

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

我們可以在 application.properties 或 application.yml 文件中添加以下內(nèi)容:

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();
}
}

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

(2)使用注解

在我們的示例應(yīng)用程序中,我們使用 @PostConstruct 注解來(lái)訂閱 MQTT 主題。在實(shí)際的應(yīng)用程序中,我們可能希望使用更具有語(yǔ)義化的注解來(lái)標(biāo)識(shí)哪些方法是用于訂閱 MQTT 主題的。

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

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

然后,在 MQTTSubscriberController 類中,我們可以使用 @MQTTSubscriber 注解來(lái)標(biāo)識(shí)訂閱 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));
}
}

在這個(gè)例子中,我們定義了一個(gè)名為 "onMessage" 的方法,并使用 @MQTTSubscriber 注解來(lái)標(biāo)識(shí)該方法是用于訂閱 MQTT 主題的。在這個(gè)方法中,我們使用兩個(gè)參數(shù)來(lái)接收收到的消息的主題和內(nèi)容。

在我們的應(yīng)用程序啟動(dòng)時(shí),我們可以使用 Spring AOP 框架來(lái)自動(dòng)掃描 @MQTTSubscriber 注解,并將被注解的方法注冊(cè)為 MQTT 主題的訂閱者。我們可以在 MQTTSubscriberAspect 類中實(shí)現(xiàn)這個(gè)功能:

@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();
}
}
}
});
}
}

在這個(gè)類中,我們使用 Spring AOP 框架的 @Aspect 注解來(lái)標(biāo)識(shí)該類是一個(gè)切面類。在 @PostConstruct 方法中,我們獲取 MQTT 訂閱者的 MqttClient 實(shí)例,并使用該實(shí)例訂閱指定的主題。然后,我們獲取被注解的方法,并遍歷這些方法,如果發(fā)現(xiàn)某個(gè)方法被標(biāo)注為 @MQTTSubscriber,并且參數(shù)個(gè)數(shù)為 2,第一個(gè)參數(shù)為 String 類型,第二個(gè)參數(shù)也為 String 類型,則將該方法注冊(cè)為訂閱者。

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

6、結(jié)論

在本文中,我們使用工廠模式實(shí)現(xiàn)了一個(gè) MQTT 訂閱和消費(fèi)的示例應(yīng)用程序。我們使用 Eclipse Paho MQTT 客戶端庫(kù)來(lái)連接 MQTT 服務(wù)器,并訂閱指定的主題。我們還使用 Spring Boot 框架來(lái)創(chuàng)建應(yīng)用程序,并使用 @PostConstruct 注解來(lái)訂閱 MQTT 主題。最后,我們介紹了使用配置文件和注解來(lái)改進(jìn)我們的實(shí)現(xiàn)的方法。這些改進(jìn)方案使我們的代碼更加具有語(yǔ)義化,并且更加容易閱讀和維護(hù)。

MQTT 是一種輕量級(jí)的消息傳遞協(xié)議,適用于物聯(lián)網(wǎng)等場(chǎng)景中的消息傳遞。它具有簡(jiǎn)單、可靠、高效等特點(diǎn),已經(jīng)被廣泛應(yīng)用于各種場(chǎng)景中。使用工廠模式和 Spring Boot 框架來(lái)實(shí)現(xiàn) MQTT 訂閱和消費(fèi),可以使我們的代碼更加清晰和易于維護(hù)。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2022-09-21 16:56:16

設(shè)計(jì)模式微服務(wù)架構(gòu)

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智領(lǐng)云

2023-03-03 08:26:32

負(fù)載均衡算法服務(wù)

2022-10-28 13:38:40

ServiceLinkerd服務(wù)網(wǎng)格

2023-07-19 08:46:00

導(dǎo)航地圖

2018-09-28 14:06:25

前端緩存后端

2022-09-22 09:00:46

CSS單位

2025-04-03 10:56:47

2022-11-06 21:14:02

數(shù)據(jù)驅(qū)動(dòng)架構(gòu)數(shù)據(jù)

2022-12-08 14:18:45

2022-03-24 17:56:51

數(shù)據(jù)平臺(tái)觀測(cè)

2021-08-11 10:10:26

Linux定時(shí)器數(shù)組

2023-11-27 17:35:48

ComponentWeb外層

2023-05-20 17:58:31

低代碼軟件

2022-07-05 06:30:54

云網(wǎng)絡(luò)網(wǎng)絡(luò)云原生

2022-07-26 00:00:03

語(yǔ)言模型人工智能

2021-12-29 18:00:19

無(wú)損網(wǎng)絡(luò)網(wǎng)絡(luò)通信網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 又黄又爽的网站 | 日韩欧美在线不卡 | 国产精品久久久久久中文字 | 亚洲一区二区电影网 | 久久久精品网 | av网站观看 | 中文字幕视频在线观看 | 91免费在线视频 | 国产精品国产馆在线真实露脸 | 色视频欧美 | 国产在线一区二区 | 久久精品一区二区 | 亚洲国产精品一区二区三区 | 日韩一区二区av | 欧洲一级视频 | 日本精品一区二区三区在线观看视频 | 天堂在线www | 午夜爽爽爽男女免费观看 | 男女羞羞视频免费看 | 免费性视频 | 日韩福利| 成在线人视频免费视频 | 亚洲国产成人精品久久久国产成人一区 | 欲色av| 久久精品国产亚洲一区二区三区 | 欧美一区二区大片 | 国产蜜臀97一区二区三区 | 久草成人网 | 欧美视频在线播放 | 日韩av在线免费 | 黄色av网站在线免费观看 | 国产草草视频 | 日韩一区二区在线视频 | 不卡一区二区三区四区 | 日韩一级精品视频在线观看 | 青青草视频网 | 91精品在线播放 | 日韩人体视频 | 四虎影视一区二区 | 精品国产一区一区二区三亚瑟 | 91短视频网址 |