最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot+MQTT+apollo實(shí)現(xiàn)訂閱發(fā)布功能的示例

 更新時(shí)間:2020年06月16日 14:53:03   作者:來(lái)串糖葫蘆  
這篇文章主要介紹了SpringBoot+MQTT+apollo實(shí)現(xiàn)訂閱發(fā)布功能的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

由于最近公司在開(kāi)發(fā)一款后臺(tái)與安卓的更新系統(tǒng),經(jīng)過(guò)再三研究之后,也是選擇Mqtt這個(gè)目前流行的框架。為了能夠讓項(xiàng)目運(yùn)營(yíng)起來(lái),最終雖說(shuō)是選擇ActiveMQ。但在這個(gè)過(guò)程中,也是發(fā)現(xiàn)Apollo作為服務(wù)器也是相當(dāng)不錯(cuò)。當(dāng)然對(duì)于后者已經(jīng)被apace放棄,不過(guò)今天還是和大家整理一下SpringBoot+MQTT+apollo實(shí)現(xiàn)訂閱發(fā)布功能的全過(guò)程。

對(duì)于項(xiàng)目首先需要用到的前提東西,比如Apollo如何下載,以及MQTT測(cè)試工具在這里就不多說(shuō)。如果真的不懂私聊Damon吧,在這里就不浪費(fèi)時(shí)間。

對(duì)于項(xiàng)目,首先你所需要引入maven包:

pom.xml

  <!-- MQTT -->
  <dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-stream</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mqtt</artifactId>
  </dependency>

其目標(biāo)就是將MQTT用在項(xiàng)目組中
接著就是項(xiàng)目yml文件的配置,使用properties,以葫蘆畫瓢就行了:

applicaiton.yml

mqtt:
 username: admin
 password: password
 host-url: tcp://127.0.0.1:8161 # 你自己服務(wù)器的地址和端口,這個(gè)需要改
 clientID: test1    # 這個(gè)改不改隨意,但不同的客戶端肯定不能一樣
 default-topic: home/garden/fountain   # 默認(rèn)主題
 timeout: 100
 keepalive: 100

# Tomcat
server:
 tomcat:
  uri-encoding: UTF-8
  max-threads: 1000
  min-spare-threads: 30
 port: 8088

注意host-url,這就是你apollo的地址

來(lái)到第三步,此時(shí)就是項(xiàng)目?jī)?nèi)的文件:

MqttConfig文件

@Component
@ConfigurationProperties("mqtt")
@Setter
@Getter
public class MqttConfig {
  @Autowired
  private MqttPushClient mqttPushClient;

  /**
   * 用戶名
   */
  // @Value("username")
  private String username;
  /**
   * 密碼
   */
  private String password;
  /**
   * 連接地址
   */
  private String hostUrl;
  /**
   * 客戶Id
   */
  private String clientID;
  /**
   * 默認(rèn)連接話題
   */
  private String defaultTopic;
  /**
   * 超時(shí)時(shí)間
   */
  private int timeout;
  /**
   * 保持連接數(shù)
   */
  private int keepalive;

  @Bean
  public MqttPushClient getMqttPushClient() {
    System.out.println("hostUrl: "+ hostUrl);
    System.out.println("clientID: "+ clientID);
    System.out.println("username: "+ username);
    System.out.println("password: "+ password);
    System.out.println("timeout: "+timeout);
    System.out.println("keepalive: "+ keepalive);
    mqttPushClient.connect(hostUrl, clientID, username, password, timeout, keepalive);
    // 以/#結(jié)尾表示訂閱所有以test開(kāi)頭的主題
    mqttPushClient.subscribe(defaultTopic, 0);
    return mqttPushClient;
  }
}

目的就是配置所對(duì)應(yīng)的消息

第四步就是發(fā)布以及訂閱等功能:

MqttPushClient

@Component
public class MqttPushClient {
  private static final Logger logger = LoggerFactory.getLogger(MqttPushClient.class);

  @Autowired
  private PushCallback pushCallback;

  private static MqttClient client;

  private static MqttClient getClient() {
    return client;
  }

  private static void setClient(MqttClient client) {
    MqttPushClient.client = client;
  }

  /**
   * 客戶端連接
   *
   * @param host   ip+端口
   * @param clientID 客戶端Id
   * @param username 用戶名
   * @param password 密碼
   * @param timeout  超時(shí)時(shí)間
   * @param keepalive 保留數(shù)
   */
  public void connect(String host, String clientID, String username, String password, int timeout, int keepalive) {
    MqttClient client;
    try {
      client = new MqttClient(host, clientID, new MemoryPersistence());
      MqttConnectOptions options = new MqttConnectOptions();
      options.setCleanSession(true);
      options.setUserName(username);
      options.setPassword(password.toCharArray());
      options.setConnectionTimeout(timeout);
      options.setKeepAliveInterval(keepalive);
      MqttPushClient.setClient(client);
      try {
        client.setCallback(pushCallback);
        client.connect(options);
      } catch (Exception e) {
        e.printStackTrace();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 發(fā)布
   *
   * @param qos     連接方式
   * @param retained  是否保留
   * @param topic    主題
   * @param pushMessage 消息體
   */
  public void publish(int qos, boolean retained, String topic, String pushMessage) {
    MqttMessage message = new MqttMessage();
    message.setQos(qos);
    message.setRetained(retained);
    message.setPayload(pushMessage.getBytes());
    MqttTopic mTopic = MqttPushClient.getClient().getTopic(topic);
    if (null == mTopic) {
      logger.error("topic not exist");
    }
    MqttDeliveryToken token;
    try {
      token = mTopic.publish(message);
      token.waitForCompletion();
    } catch (MqttPersistenceException e) {
      e.printStackTrace();
    } catch (MqttException e) {
      e.printStackTrace();
    }
  }

  /**
   * 訂閱某個(gè)主題
   *
   * @param topic 主題
   * @param qos  連接方式
   */
  public void subscribe(String topic, int qos) {
    logger.info("開(kāi)始訂閱主題" + topic);
    try {
      MqttPushClient.getClient().subscribe(topic, qos);
    } catch (MqttException e) {
      e.printStackTrace();
    }
  }
}

訂閱主題以及發(fā)布的方式等內(nèi)容更多編寫
最后在搞個(gè)測(cè)試看看我們的結(jié)果是否正確:

TestController

@RestController
@RequestMapping("/")
public class TestController {

  @Autowired
  private MqttPushClient mqttPushClient;

  @GetMapping(value = "/publishTopic")
  public String publishTopic() {
    String topicString = "home/garden/fountain";
    mqttPushClient.publish(0, false, topicString, "測(cè)試一下發(fā)布消息");
    return "ok";
  }
  // 發(fā)送自定義消息內(nèi)容(使用默認(rèn)主題)
  @RequestMapping("/publishTopic/{data}")
  public String test1(@PathVariable("data") String data) {
    String topicString = "home/garden/fountain";
    mqttPushClient.publish(0,false,topicString, data);
    return "ok";
  }

  // 發(fā)送自定義消息內(nèi)容,且指定主題
  @RequestMapping("/publishTopic/{topic}/{data}")
  public String test2(@PathVariable("topic") String topic, @PathVariable("data") String data) {
    mqttPushClient.publish(0,false,topic, data);
    return "ok";
  }
}

如此一來(lái)就OK!

你可以使用MQTT.fx進(jìn)行測(cè)試。用Postman發(fā)出,就能夠查看最終的結(jié)果。在這里,因?yàn)闀r(shí)間的原因就不多說(shuō),有啥有趣的問(wèn)題,咱們可以一同探討。 希望你希望,Damon將會(huì)不斷的分享各種有趣的開(kāi)發(fā)小故事給大家?jiàn)蕵?lè)。下一期,或在POI實(shí)現(xiàn)導(dǎo)出導(dǎo)入或者是ActiveMQ進(jìn)行選擇。

到此這篇關(guān)于SpringBoot+MQTT+apollo實(shí)現(xiàn)訂閱發(fā)布功能的示例的文章就介紹到這了,更多相關(guān)SpringBoot+MQTT+apollo訂閱發(fā)布內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入JAVA對(duì)象深度克隆的詳解

    深入JAVA對(duì)象深度克隆的詳解

    本篇文章是對(duì)JAVA對(duì)象深度克隆進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Java異步編程Future應(yīng)用方式

    Java異步編程Future應(yīng)用方式

    Java中的Future接口用于構(gòu)建復(fù)雜并行操作,它允許異步執(zhí)行任務(wù),并在需要時(shí)獲取結(jié)果,通過(guò)Future接口,可以避免多線程編程中的一些常見(jiàn)問(wèn)題,如線程執(zhí)行順序和結(jié)果獲取的復(fù)雜性,然而,在使用Future時(shí)需要注意,并行執(zhí)行可能會(huì)變?yōu)榇袌?zhí)行,特別是在使用get()方法時(shí)
    2025-02-02
  • Hibernate 與 Mybatis 的共存問(wèn)題,打破你的認(rèn)知!(兩個(gè)ORM框架)

    Hibernate 與 Mybatis 的共存問(wèn)題,打破你的認(rèn)知!(兩個(gè)ORM框架)

    這篇文章主要介紹了Hibernate 與 Mybatis 如何共存?本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java中Set與List的關(guān)系與區(qū)別介紹

    Java中Set與List的關(guān)系與區(qū)別介紹

    這篇文章主要介紹了Java中Set與List的關(guān)系與區(qū)別介紹,本文總結(jié)它們兩個(gè)接口都是繼承自Collection、它們之間的存儲(chǔ)方式不一樣,需要的朋友可以參考下
    2015-03-03
  • Java實(shí)現(xiàn)跳轉(zhuǎn)到指定頁(yè)面的方法小結(jié)

    Java實(shí)現(xiàn)跳轉(zhuǎn)到指定頁(yè)面的方法小結(jié)

    在Java中,實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)主要涉及到Web開(kāi)發(fā),而這通常通過(guò)使用Java的Web框架(如Servlet、Spring MVC)來(lái)完成,下面講解一下如何在不同的Java Web框架中實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-05-05
  • java線程的基礎(chǔ)實(shí)例解析

    java線程的基礎(chǔ)實(shí)例解析

    java中線程的基本方法的熟練使用是精通多線程編程的必經(jīng)之路,線程相關(guān)的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文淺要的介紹一下它們的使用方式
    2021-06-06
  • Java中的Vector詳細(xì)解讀

    Java中的Vector詳細(xì)解讀

    這篇文章主要介紹了Java中的Vector詳細(xì)解讀,Vector是實(shí)現(xiàn)了List接口的子類,其底層是一個(gè)對(duì)象數(shù)組,維護(hù)了一個(gè)elementData數(shù)組,是線程安全的,Vector類的方法帶有synchronized關(guān)鍵字,在開(kāi)發(fā)中考慮線程安全中使用Vector,需要的朋友可以參考下
    2023-09-09
  • 關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解

    關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解

    這篇文章主要介紹了關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解,RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,需要的朋友可以參考下
    2023-05-05
  • Java實(shí)現(xiàn)按行讀取大文件

    Java實(shí)現(xiàn)按行讀取大文件

    這篇文章主要介紹了Java實(shí)現(xiàn)按行讀取大文件的方法的小結(jié),非常的簡(jiǎn)單實(shí)用,有需要的小伙伴尅參考下。
    2015-05-05
  • 淺談springboot內(nèi)置tomcat和外部獨(dú)立部署tomcat的區(qū)別

    淺談springboot內(nèi)置tomcat和外部獨(dú)立部署tomcat的區(qū)別

    這篇文章主要介紹了淺談springboot內(nèi)置tomcat和外部獨(dú)立部署tomcat的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10

最新評(píng)論

十堰市| 阿坝县| 泸州市| 普兰店市| 壶关县| 汝南县| 西乌珠穆沁旗| 武胜县| 宁武县| 茌平县| 林芝县| 奈曼旗| 武夷山市| 绍兴市| 方城县| 沙雅县| 靖安县| 故城县| 甘谷县| 台东县| 西乌| 大理市| 富平县| 永平县| 东安县| 南溪县| 双桥区| 阳西县| 罗山县| 怀化市| 吉林市| 灵台县| 莒南县| 延寿县| 陵川县| 洪雅县| 荥阳市| 姜堰市| 红桥区| 子洲县| 泗洪县|