mq服務器與客戶端消息同步,使用 ActiveMQ 實現JMS 異步調用

目錄

簡介

服務之間的同步調用,可以使用 HTTP 或 RPC 來完成,但并非所有的調用都需要同步,有些場景下,當客戶端調用服務端時,并不需要等待服務端做出響應,此時就應該使用異步調用。異步調用的常用方式是基于 MQ (Message Queue) 來實現的。下文會以 ActiveMQ 為例進行講解。

ActiveMQ 是 Java 世界中最為流行的開源消息中間件,它不僅功能強大,而且性能穩定。它可全面支持 JMS(Java 消息服務)技術規范,為 Java 應用程序提供標準的 JMS API。

此外 ActiveMQ 具備與 Spring 框架整合的能力,它一直都是 Spring 應用程序的消息中間件標配。同樣, Spring Boot 也提供了 ActiveMQ 的開箱即用的插件,只需要幾項配置,就能接入 ActiveMQ,并輕松使用 JMS API 編寫異步消息通信程序。

Active MQ 官網地址如下

http://activemq.apache.org

啟動 ActiveMQ 服務器

先使用 docker 安裝 ActiveMQ ,目前 ActiveMQ 官方并未提供相應的 Docker 鏡像,我們選擇使用第三方鏡像 webcenter/activemq 。

docker pull webcenter/activemq:5.14.3

接下來運行 ActiveMQ

docker run -d -p 8161:8161 -p 61616:61616 -e ACTIVEMQ_ADMIN_LOGIN=admin -e ACTIVEMQ_ADMIN_PASSWORD=admin --name activemq webcenter/activemq:5.14.3

在啟動 ActiveMQ 容器時,容器對宿主機暴露了兩個端口號:

8161: 表示 ActiveMQ 控制臺端口號,可在瀏覽器中通過控制臺來執行 ActiveMQ 的相關操作

61616: 表示 ActiveMQ 所監聽的 TCP 端口號,應用程序可通過該端口號與 ActiveMQ 建立 TCP 連接,并完成后續的異步消息通信

此外,在啟動 ActiveMQ 容器時,還提供了兩個環境變量

ACTIVEMQ_ADMIN_LOGIN: 用于設置控制臺管理員的用戶名,默認為 admin

ACTIVEMQ_ADMIN_PASSWORD: 用于設置控制臺管理員的密碼,默認為 admin

查看控制臺

webcenter/activemq 鏡像擁有一個基于 Web 的控制臺,可通過瀏覽器訪問。容器啟動完畢后,可以打開瀏覽器,并在地址欄中輸入 http://localhost:8161

cc4d6fab385d3809899b3bfc71022f42.png

點擊 Manage ActiveMQ borker 鏈接,瀏覽器將彈出一個對話框,此時輸入用戶名和密碼,認證通過后會進入管理界面

2d4f6c152ba492f58877682c3fd37930.png

在管理界面中,包括 8 個功能菜單

Home: 基本信息

Queues: 管理的隊列

Topics: 查看所管理的主題

Subscribers: 查看相關主題的訂閱者

Connections: 查看客戶端的連接信息

Network: 查看網絡相關信息

Scheduled: 查看 ActiveMQ 內部運行的定時任務

Send: 通過表單方式查看向隊列或主題發送具體消息

ActiveMQ 的消息通道

ActiveMQ 管理了兩類消息通道,一類是隊列(Queue),另一類叫做主題(Topic)。

Queue

Queue 用于解決消息的 點對點 通信問題,也就是說,消息從生產者(Producer) 發出后,首先進入 ActiveMQ 某個指定的 Queue 中,然后再將消息傳送給其中一個消費者(Consumer)。

356be9eda46b191461a3bfbecf34d905.png

Topic

Topic 用于解決消息的發布與訂閱(Publish-subscribe) 通信問題,也就是說,消息從 Producer 發出后,首先將其發布到 ActiveMQ 某個指定的 Topic 上,然后將此消息分發給每個訂閱者(Subscriber) 。

087a388edfd91deaf78000b114af68f3.png

比較

在具體場合下,靈活使用以上兩種通信模式來實現 Producer 與 Consumer/Subscriber 間的異步調用,從而解決調用方的耦合問題。可見,Queue 能解決調用緩沖問題,Topic 能解決消息廣播問題, Queue 與 Topic 都能解決掉調用耦合問題,這些技術都為一個好的軟件架構提供了有效的支撐。

開發生產者和消費者

下面就以 Queue 為例,將 ActiveMQ 與 Spring Boot 進行整合,將 Producer 作為客戶端, Consumer 作為服務端,通過 Queue 實現客戶端與服務端的異步調用

開發服務端(消費者)

首先創建一個名為 acitvemq-hello-server 的 spring boot 項目,如果在 eclipse 中安裝了 Spring Tools ,可以在新建時選擇 New Spring Starter Project 選項。或者新建 Maven 工程。對應的 maven 依賴如下

org.springframework.boot

spring-boot-starter-parent

1.5.19.RELEASE

org.springframework.boot

spring-boot-starter-activemq

在 Spring Boot 框架中已經內置了對 ActiveMQ 的支持,我們只需要依賴 spring-boot-starter-mq 就能啟動 ActiveMQ,此時還需要在 application.properties 文件中添加 ActiveMQ 配置項

spring.activemq.broker-url=tcp://10.104.10.1:61616

spring.activemq.user=admin

spring.activemq.password=admin

接下來創建 HelloServer 的類,封裝服務端相關代碼

@Component

public class HelloServer {

@JmsListener(destination="hello-queue")

public void receive(String message) {

System.out.println(message);

}

}

使用 @Component 注解,說明它可被 Spring IoC 容器所管理。此時只需要使用 @JmsListener 注解,并將其綁定到 receive() 方法上,就能從 ActiveMQ 中接收響應的消息。

@JmsListener 注解中需要添加一個 destination 屬性來指定 Queue/Topic 的名稱,該名稱具有唯一性。消息將以一個 String 類型參數的形式傳入方法體中,也可以接收其他類型的消息,這取決于客戶端發送的消息是哪種類型。Spring JMS 將消息放入 ActiveMQ 時會進行序列化,當消息從 ActiveMQ 取出時將進行反序列化,應用程序無需關注這些底層細節,只需要將精力放在業務邏輯上。

最后,編寫一個 Spring Boot 應用程序啟動類來啟動服務端(使用 spring tools 工具會自動生成)

@SpringBootApplication

public class ActivemqHelloServerApplication {

public static void main(String[] args) {

SpringApplication.run(ActivemqHelloServerApplication.class, args);

}

}

當服務端啟動完畢后,將一直監聽 ActiveMQ 的 hello-queue 隊列中即將到來的消息,消息由客戶端來發送。

開發客戶端(生產者)

創建一個名為 active-mq-client 的 Maven 項目, pom.xml 文件內容與服務端相似。application.properties 文件與服務端相同。

接下來創建一個名為 HelloClient 的類,將其作為客戶端。

@Component

public class HelloClient {

@Autowired

private JmsTemplate jmsTemplate;

public void send(String message) {

jmsTemplate.convertAndSend("hello-queue", message);

}

}

這里使用了 @Autowired 注解, JmsTemplate 對象注入進來,還編寫了一個 send() 方法,在該方法中調用 JmsTemplate 對象的 convertAndSend 來轉換并發送消息。

最后使用 Spring Boot 應用程序啟動類來啟動客戶端

@SpringBootApplication

public class ActivemqHelloClientApplication {

@Autowired

private HelloClient helloClient;

@PostConstruct

public void init() {

helloClient.send("hello world");

}

public static void main(String[] args) {

SpringApplication.run(ActivemqHelloClientApplication.class, args);

}

}

需要注意的是, init() 方法帶有 @PostConstruct 注解,表示 Spring IoC 容器實例化 ActivemqHelloClientApplication 類后將調用該方法。

運行 main() 方法可以啟動客戶端應用程序,并可以在服務端應用程序控制臺中看到 client 發送的消息,也可以在 ActiveMQ 控制臺中查看隊列的當前狀態

4564b7200e9174cfed7c0f1e7b8fbf1d.png

Queue 表格中列明的含義如下

Name 表示隊列名稱,可在應用程序中自動創建,也可在 ActiveMQ 控制臺中手動創建

Number Of Pending Messages 表示阻塞在隊列中未經消費的消息條數

Number Of Consumers 表示正在與 ActiveMQ 建立連接的消費者數量

Messages Enqueued 表示進入隊列的消息數量

Messages Dequeued 表示離開隊列的消息數量

此外,還有下面幾種操作

Browser 用于查看當前隊列中消息的相關細節

Active Consumers 用于查看當前活動消費者的相關信息

Active Producers 用于查看當前活動生產者的相關信息

Send To 用于向當前隊列中發送具體消息

Purge 用于清空隊列中的消息

Delete 用于刪除當前隊列

參考

《架構探險—輕量級微服務架構》

原文:https://www.cnblogs.com/reycg-blog/p/10265139.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372943.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多個數字數組_七個問題幫助初學者深入理解Java數組

短文漲姿勢,看了不白看,不關注等啥?幾乎所有的高級語言當中,都提供了一種叫做”數組”的東西,Java語言當然也不例外。我們通過數組可以很方便的存儲和管理一組數據。因為在Java語言當中使用數組非常的方便,…

java 異常練習題1

建立exception包,建立Bank類,類中有變量double balance表示存款,Bank類的構造方法能增加存款,Bank類中有取款的發方法withDrawal(double dAmount),當取款的數額大于存款時,拋出InsufficientFundsException,取款數額為負數,拋出Nag…

大話設計模式讀書筆記--6.原型模式

簡單的復制粘貼極有可能造成重復代碼的災難, 但是java中提供了克隆的功能, 如果一個對象創建過程復雜,又要頻繁使用, 在初始化信息不發生變化的情況下,應當采取克隆而不是new一個對象 定義 原型模式: 用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象 也就是說,…

Java 7#8:測試臺上的NIO.2文件通道

關于新JDK 7功能的另一篇博客文章。 這次我正在寫有關新的AnsynchronousFileChannel類的文章。 我將在兩周內深入分析新的JDK 7功能,并決定連續編號我的帖子。 只是為了確保我不會感到困惑:-)這是我關于Java 7的第七篇文章(我承認–碰巧–這也…

5頁面title樣式修改_認識html:實現網站頁面是這么簡單的一回事

互聯網時代人們通過上網瀏覽信息,打開瀏覽器上網看到豐富的圖文、視頻、音樂等多媒體信息,一系列信息反饋和視覺沖擊之后,您有沒有想過,互聯網這么發達的時代,您覺得花一點點時間學會做個網站頁面不真香?概…

iOS指南針

前言: 這個小項目使用到了CoreLocation框架里面的設備朝向功能,對CoreLocation感興趣的可以翻一下之前的文章 在另一個博客站有朋友發現一個尷尬的問題(圖片的東西2個方向是不對的),原諒我的大意,趕時間就直…

OSGI –模塊化您的應用程序

由于我是模塊化,低耦合,高凝聚力等的大力擁護者,所以…… 我相信這項技術是我們使用Java平臺創建應用程序的突破。 使用OSGi,創建高度可擴展的應用程序非常簡單,例如參見Eclipse IDE。 我的目的不是要深入展示該技術的…

jq的鏈式調用.end();

jq的鏈式調用.end(); 先上code <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>li{list-style: none;width: 100px;height:20px;border:1px solid #ff0000;display: …

三、自定義視圖、視圖控制器

1.自定義視圖 自定義視圖&#xff1a;系統標準UI之外&#xff0c;自己組合而出的新的視圖。在實際開發中&#xff0c;我們經常需要自己定義視圖&#xff0c;積累自己的代碼庫。自己封裝的視圖&#xff0c;能像系統提供的UI控件一樣用于多個項目中&#xff0c;這樣可以提高我們的…

程序如何在兩個gpu卡上并行運行_深度學習分布式訓練相關介紹 - Part 1 多GPU訓練...

本篇文章主要是對深度學習中運用多GPU進行訓練的一些基本的知識點進行的一個梳理文章中的內容都是經過認真地分析&#xff0c;并且盡量做到有所考證拋磚引玉&#xff0c;希望可以給大家有更多的啟發&#xff0c;并能有所收獲介紹大多數時候&#xff0c;梯度下降算法的訓練需要較…

集成Spring和JavaServer Faces:改進的模板

隨著2.0版的發布&#xff0c;Facelet模板成為JSF規范的核心部分。 使用<ui&#xff1a;composition>和<ui&#xff1a;decorate>標記&#xff0c;可以輕松構建復雜的頁面&#xff0c;同時仍保持標記清晰。 模板在創建HTML表單時特別有用&#xff0c;但是不幸的是&a…

whmcs模板路徑

whmcs網站根目錄 比如你的域名是server.nongbin.vip&#xff0c;你需要cd /home/wwwroot/server.nongbin.vip&#xff0c;該目錄下然后&#xff0c;cd template/ 給文件夾下就是你上傳的模板文件夾轉載于:https://www.cnblogs.com/nongbin/p/6412108.html

系統英偉達gpu驅動卸載_繞過CPU,英偉達讓GPU直連存儲設備

英偉達最近發布了一個新的GPUDirect Storage&#xff0c;暫且叫做GPU直連存儲&#xff0c;讓GPU直接連到NVMe存儲設備上。這一方案用到了RDMA設備來把數據從閃存存儲轉移到GPU本地的內存里&#xff0c;無需經過CPU還有系統內存。如果這一舉措順利的話&#xff0c;英偉達就能擺脫…

37、EnumSet詳解

EnumSet類也是有順序的&#xff0c;EnumSet按照枚舉值在Enum類內定義的順序決定集合元素的順序 EnumSet在內部已位向量的形式存儲&#xff0c;這種存儲方式非常緊湊、搞笑&#xff0c;因此EnumSet占用內存很小&#xff0c;而且運行效率很好。 EnumSet集合不允許加入null元素 En…

嘲弄和存根–了解Mockito的測試雙打

介紹 我遇到的一件事是使用模擬框架的團隊假設他們在模擬。 他們并不知道Mocks只是Gerard Meszaros在xunitpatterns.com上歸類的“測試雙打”之一。 重要的是要意識到每種類型的測試雙精度在測試中都扮演著不同的角色。 用與您需要學習不同模式或重構的方式相同&#xff0c;您…

numpy 辨異(三)—— hstack/column_stack,linalg.eig/linalg.eigh

1. np.hstack np.column_stack >>> np.hstack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([1, 2, 3, 4, 5, 6])>>> np.column_stack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 4],[2, 5],[3, 6]]) 當然對等地&#xff0c;也存在&…

【代碼筆記】iOS-首頁3張圖片變化

一&#xff0c;效果圖。 二&#xff0c;工程圖。 三&#xff0c;代碼。 RootViewController.h #import <UIKit/UIKit.h>interface RootViewController : UIViewController {NSTimer *timer;UIImageView *imageView1;UIImageView *imageView2;UIImageView *imageView3;UIV…

acwing算法提高之動態規劃--數位DP

目錄 1 基礎知識2 模板3 訓練 1 基礎知識 暫無。。。 2 模板 暫無。。。 3 訓練 題目1&#xff1a;度的數量。 解題思路&#xff1a;分類討論。 C代碼如下&#xff0c; #include <iostream> #include <vector>using namespace std;const int N 35; int K,…

python 輸入數字變成密碼_如何在python中檢查數字的“密碼”

我建議使用sets和stdlib中的string包作為可接受字符的列表。在我還建議進行一點重構&#xff0c;以刪除大量帶有if / else分支的嵌套。在import stringupper set(list(string.uppercase))lower set(list(string.lowercase))numbers set(list(string.digits))while True:npw …

使用Eclipse在Amazon Ec2中部署Java Web應用程序的完整指南

嗨&#xff0c;讀者們&#xff0c; 今天&#xff0c;我將向您展示如何使用Eclipse IDE在Amazon EC2中部署簡單的Java Web應用程序。 在我們開始之前&#xff0c;我們需要一些必需的東西&#xff0c; Eclipse Java EE IDE –您可以從http://www.eclipse.org/downloads/下載&…