啟動activemq_「Java」 - SpringBoot amp; ActiveMQ

一、消息隊列

消息隊列中間件是分布式系統中重要的組件,主要解決應用耦合、異步消息、流量削鋒等問題,實現高性能、高可用、可伸縮和最終一致性架構,是大型分布式系統不可缺少的中間件。

目前在生產環境中使用較多的消息隊列有ActiveMQ、RabbitMQ、Kafka、RocketMQ等。

A、特性

  • 異步性:將耗時的同步操作以消息的方式進行異步化處理,減少了同步等待的時間;
  • 松耦合:消息隊列減少了服務之間的耦合性,不同的服務可以通過消息隊列進行通信,而不用關心彼此的實現細節,只要定義好消息的格式就行;
  • 分布式:通過對消費者的橫向擴展,降低了消息隊列阻塞的風險,以及單個消費者產生單點故障的可能性;
  • 可靠性:消息隊列一般會把接收到的消息存儲到本地硬盤上,這樣即使應用掛掉或者消息隊列本身掛掉,消息也能夠重新加載。

B、JMS規范

JMS即Java消息服務(Java Message Service)應用程序接口,是Java面向消息中間件(MOM)的API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數MOM提供商都對JMS提供支持。

JMS的消息機制有2種模型,一種是Point to Point,表現為隊列的形式,發送的消息,只能被一個接收者取走;另一種是Topic,可以被多個訂閱者訂閱,類似于群發。

ActiveMQ就是JMS的一個實現。

二、ActiveMQ介紹

ActiveMQ是Apache軟件基金下的一個開源軟件,它遵循JMS 1.1規范,是消息驅動中間件軟件。它為企業消息傳遞提供高可用、出色性能、可擴展、穩定和安全保障。ActiveMQ使用Apache許可協議,因此,任何人都可以使用和修改它而不必反饋任何改變。

ActiveMQ的目標是在盡可能多的平臺和語言上提供一個標準的,消息驅動的應用集成。ActiveMQ實現JMS規范并在此之上提供大量額外的特性。ActiveMQ支持隊列和訂閱兩種模式的消息發送。

Spring Boot提供了ActiveMQ組件spring-boot-starter-activemq,用來支持ActiveMQ在Spring Boot體系內使用。

A、ActiveMQ安裝

1、下載安裝啟動

# 安裝JDK并配置環境# 下載activemq
wget http://archive.apache.org/dist/activemq/5.12.2/apache-activemq-5.12.2-bin.tar.gz# 解壓安裝
cd /usr/local/apache-activemq-5.12.2/bin# 啟動ActiveMQ
./activemq start# web控制臺
http://192.168.240.131:8161
admin/admin

2、安全配置

安裝完成ActiveMQ后,任何連接到ActiveMQ的程序都可以創建和消費隊列,可以通過修改配置文件conf/activemq.xml來加入身份驗證,在文件的borker標簽中加入:

<plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username="admin" password="admin" groups="users,admins"/> </users> </simpleAuthenticationPlugin> 
</plugins>

控制臺賬號密碼,修改conf/jetty.xml,確保authenticate的值是true。

<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint"> <property name="name" value="BASIC" /> <property name="roles" value="admin" /> <property name="authenticate" value="true" /> 
</bean>

登陸管控臺的帳號和密碼在conf/jetty-realm.properties文件。

# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: admin, admin

重啟生效。

A、相關依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

B、配置文件

在使用ActiveMQ時有兩種使用方式,一種是使用獨立安裝的ActiveMQ,在生產環境推薦使用這種;另一種是使用基于內存ActiveMQ ,在調試階段建議使用這種方式。

# 基于內存 
ActiveMQspring.activemq.in-memory=true# 不適應連接池
spring.activemq.pool.enabled=false# 獨立安裝ActiveMQ
#spring.activemq.broker-url=tcp://10.255.242.168:61616
#spring.activemq.user=admin
#spring.activemq.password=admin

三、隊列(Queue)

隊列發送的消息,只能被一個消費者接收。

A、創建隊列

@Configuration
public class ActiveMqConfig
{@Beanpublic Queue queue(){return new ActiveMQQueue("isisiwish.test.queue");}
}

使用定義了隊列queue命名為isisiwish.test.queue。

B、消息生產者

@Slf4j
@Component
public class Producer
{@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Queue queue;public void sendQueue(String msg){log.info("send queue msg : {}", msg);this.jmsMessagingTemplate.convertAndSend(this.queue, msg);}
}

JmsMessagingTemplate是Spring提供發送消息的工具類,使用JmsMessagingTemplate和創建好的queue對消息進行發送。

C、消息消費者

@Slf4j
@Component
public class ConsumerA
{@JmsListener(destination = "isisiwish.test.queue")public void receiveQueue(String text){log.info("ConsumerA queue msg : {}", text);}
}@Slf4j
@Component
public class ConsumerB
{@JmsListener(destination = "isisiwish.test.queue")public void receiveQueue(String text){log.info("ConsumerB queue msg : {}", text);}
}

使用注解@JmsListener(destination = "isisiwish.test.queue"),表示此方法監控了名為isisiwish.test.queue的隊列。當隊列isisiwish.test.queue中有消息發送時會觸發此方法的執行,text為消息內容。

D、測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class MqActivemqQueueApplicationTests
{@Autowiredprivate Producer producer;@Testpublic void sendSimpleQueueMessage() throws InterruptedException{this.producer.sendQueue("Test queue message");}@Testpublic void send100QueueMessage() throws InterruptedException{for (int i = 0; i < 100; i++){this.producer.sendQueue("Test queue message " + i);}Thread.sleep(1000L);}
}

當有多個消費者監聽一個隊列時,消費者會自動均衡負載的接收消息,并且每個消息只能有一個消費者所接收。

PS:控制臺輸出javax.jms.JMSException: peer (vm://localhost#1) stopped.報錯信息可以忽略。

四、廣播(Topic)

廣播發送的消息,可以被多個消費者接收。

A、創建Topic

@Configuration
public class ActiveMqConfig
{@Beanpublic Topic topic(){return new ActiveMQTopic("isisiwish.test.topic");}
}

B、消息生產者

@Slf4j
@Component
public class ConsumerA
{@JmsListener(destination = "isisiwish.test.topic")public void receiveTopic(String text){log.info("ConsumerA topic msg : {}", text);}
}@Slf4j
@Component
public class ConsumerB
{@JmsListener(destination = "isisiwish.test.topic")public void receiveTopic(String text){log.info("ConsumerB topic msg : {}", text);}
}

C、消息消費者

@Slf4j
@Component
public class Producer
{@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Topic topic;public void sendTopic(String msg){log.info("send queue msg : {}", msg);this.jmsMessagingTemplate.convertAndSend(this.topic, msg);}
}

D、測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class MqActivemqTopicApplicationTests
{@Autowiredprivate Producer producer;@Testpublic void sendSimpleTopicMessage() throws InterruptedException{this.producer.sendTopic("Test Topic message");Thread.sleep(1000L);}
}

廣播(Topic)是一個發送者多個消費者的模式,兩個消費者都收到了發送的消息。

五、同時支持隊列(Queue)和廣播(Topic)

Spring Boot集成ActiveMQ的項目默認只支持隊列或者廣播中的一種,通過配置項 spring.jms.pub-sub-domain的值來控制,true為廣播模式,false為隊列模式,默認情況下支持隊列模式。

如果需要在同一項目中既支持隊列模式也支持廣播模式,可以通過DefaultJmsListenerContainerFactory創建自定義的JmsListenerContainerFactory實例,之后在@JmsListener注解中通過containerFactory屬性引用它。

分別創建兩個自定義的JmsListenerContainerFactory實例,通過pubSubDomain來控制是支持隊列模式還是廣播模式。

@Configuration
@EnableJms
public class ActiveMqConfig
{@Bean("queueListenerFactory")public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory){DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setPubSubDomain(false);return factory;}@Bean("topicListenerFactory")public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory){DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setPubSubDomain(true);return factory;}@Beanpublic Queue queue(){return new ActiveMQQueue("isisiwish.test.queue");}@Beanpublic Topic topic(){return new ActiveMQTopic("isisiwish.test.topic");}
}

在消費者接收的方法中,指明使用containerFactory接收消息。

@Slf4j
@Component
public class ConsumerA
{@JmsListener(destination = "isisiwish.test.queue", containerFactory = "queueListenerFactory")public void receiveQueue(String text){log.info("ConsumerA queue msg : {}", text);}@JmsListener(destination = "isisiwish.test.topic", containerFactory = "topicListenerFactory")public void receiveTopic(String text){log.info("ConsumerA topic msg : {}", text);}
}

常用配置。

# 基于內存的ActiveMQ
#spring.activemq.in-memory=true
#spring.activemq.pool.enabled=false# 獨立安裝的ActiveMQ
spring.activemq.broker-url=tcp://10.255.242.168:61616
spring.activemq.user=admin
spring.activemq.password=admin# 結束之前等待的時間
#spring.activemq.close-timeout=15s# 等待消息發送響應的時間,設置為0永遠等待
spring.activemq.send-timeout=0# 默認情況下ActiveMQ提供的是queue模式,若要使用topic模式需要配置下面配置
#spring.jms.pub-sub-domain=true#賬號
# spring.activemq.user=admin# 密碼
# spring.activemq.password=admin# 是否信任所有包
#spring.activemq.packages.trust-all=# 要信任的特定包(逗號分隔)
#spring.activemq.packages.trusted=# 當連接請求和滿時是否阻塞,設置false會拋出JMSException異常
#spring.activemq.pool.block-if-full=true# 如果池滿,則在拋出異常前阻塞時間
#spring.activemq.pool.block-if-full-timeout=-1ms# 是否在啟動時創建連接,可以在啟動時用于熱加載
#spring.activemq.pool.create-connection-on-startup=true# 是否用Pooledconnectionfactory代替普通的ConnectionFactory
#spring.activemq.pool.enabled=false# 連接過期超時
#spring.activemq.pool.expiry-timeout=0ms# 連接空閑超時
#spring.activemq.pool.idle-timeout=30s# 連接池最大連接數
#spring.activemq.pool.max-connections=1# 每個連接的有效會話的最大數目。
#spring.activemq.pool.maximum-active-session-per-connection=500# 當有JMSException時嘗試重新連接
#spring.activemq.pool.reconnect-on-exception=true# 空閑連接清除線程之間運行的時間,當為負數時,沒有空閑連接驅逐線程運行
#spring.activemq.pool.time-between-expiration-check=-1ms# 是否只使用一個MessageProducer
#spring.activemq.pool.use-anonymous-producers=true

ab49cc5513a91cd1c2cf566ef85e81a0.png

六、總結

消息中間件廣泛應用在大型互聯網架構中,利用消息中間件隊列和廣播各自的特性可以支持很多業務,比如群發發送短信、給單個用戶發送郵件等。

ActiveMQ是一款非常流行的消息中間件,它的特點是部署簡單、使用方便,比較適合中小型團隊。Spring Boot提供了集成ActiveMQ對應的組件,在Spring Boot中使用ActiveMQ只需要添加相關注解即可。

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

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

相關文章

永不休眠怎么設置_電腦休眠后應該怎樣喚醒?

可能有朋友會碰到這種情況&#xff0c;電腦屏幕顯示正在休眠&#xff0c;而且不停的轉圈&#xff0c;這是怎么回事&#xff0c;如何喚醒?下面讓堅哥為大家分析一下吧。電腦開機顯示休眠一般根據以下幾種情況進行處理&#xff1a;1、正常電腦休眠&#xff1a;一般的是按一下電源…

配置ssl證書_Mysql配置ssl證書

本環境基于mysql5.6配置&#xff0c;通過openssl生成證書進行配置一、確認環境信息1、查看數據庫版本mysql> select version();-----------| version() |-----------| 5.6.36 |-----------2、查看數據庫是否支持ssl配置mysql> show variables like have%ssl%;-----------…

echarts散點圖中大小_echarts在地圖上繪制散點圖(任意點)

項目需求&#xff1a;在省份地圖上繪制散點圖&#xff0c;散點位置不一定是哪個城市或哪個區縣&#xff0c;即任意點通過查詢官網文檔&#xff0c;找到一個與需求類似的demo&#xff1a;&#xff0c;更改代碼&#xff0c;將中國地圖替換為省份地圖&#xff0c;省份地圖的js代碼…

如何讓圖片充滿excel單元格_如何在Excel單元格建立下拉菜單

對于一些常用的數據我們往往會希望能夠盡量快速的輸入&#xff0c;下拉菜單就是一個最簡單的解決辦法。那么如何實現下拉菜單呢&#xff1f;跟隨以下步驟&#xff0c;建立屬于自己的下拉菜單吧&#xff01;如何建立下拉菜單&#xff1f;一、確定內容&#xff1a;在單元格中&…

pgsql中float4導致java程序精度丟失_Java基礎系列02

注釋Java中支持三種注釋&#xff1a;1.單行注釋以//開始換行結束。2.多行注釋以/*開始&#xff0c;以*/結束。3.說明注釋以/**開始&#xff0c;以*/結束。關鍵字關鍵字&#xff1a;是指在程序中&#xff0c;Java已經定義好的單詞&#xff0c;具有特殊含義。例如上篇文章中Hello…

python地理位置聚類_python – 用于聚類地理位置數據的DBSCAN

我有一個緯度和經度對的數據幀.這是我的數據幀外觀.order_lat order_long0 19.111841 72.9107291 19.111342 72.9083872 19.111342 72.9083873 19.137815 72.9140854 19.119677 72.9050815 19.119677 72.9050816 19.119677 72.9050817 19.120217 72.9071218 19.120217 72.90712…

用idea建立jsp項目_用idea創建maven項目,配置tomcat詳解

用idea創建maven項目&#xff0c;配置tomcat詳解&#xff0c;電腦上得有jdk1.7&#xff0c;或者1.8&#xff0c;然后就是maven3.x吧&#xff0c;再有就是tomcat7以上下面就直接開始看圖啦&#xff1a;這個我剛剛開始沒注意細看&#xff0c;原來web app 的骨架有2個呢&#xff0…

求立方根_初一數學立方根考點詳解,立足基礎,把握題型,學會方法

初一數學實數部分&#xff0c;平方根和立方根這兩部分的知識點比較的基礎&#xff0c;但是考試中卻是經常會考&#xff0c;并且有很多的“陷阱”&#xff0c;也是讓學生猝不及防&#xff0c;今天我和同學們繼續學習交流立方根的知識點&#xff0c;通過詳解考點&#xff0c;幫助…

ctf音頻yinxie_ctf-圖片隱寫術

文件隱藏常見文件頭尾jpg 文件頭FFD8FFE0 文件尾FFD9png 文件頭89504E470D0A1A0A 文件尾AE426082gif 文件頭47494638 文件尾003Bzip 文件頭504B0304 文件尾rar 文件頭Rar! 文件尾7zip 文件頭7z集 文件尾文件分析工具binwalk,kali中集成工具&#xff0c;用于分析文件中所包含的內…

mysql負責均衡讀寫分離_MySQL讀寫分離之負載均衡

mysql官方文檔中有這么一句話&#xff1a;MySQL Proxy is currently an Alpha release and should not be used within production environments.So。。。使用haproxy來做這些事&#xff0c;以下僅供參考&#xff1a;環境配置master 192.168.1.106 master1s…

mysql使用技巧_MySQL使用不得不看的幾個小技巧

程序中寫入的一行行的SQL語句&#xff0c;如果使用了一些優化小技巧&#xff0c;定能達到事半功倍的效果。1. 優化你的MySQL查詢緩存在MySQL服務器上進行查詢&#xff0c;可以啟用高速查詢緩存。讓數據庫引擎在后臺悄悄的處理是提高性能的最有效方法之一。當同一個查詢被執行多…

mysql oracle 數據類型轉換_Mysql與Oracle之間的數據類型轉換

&lbrack;轉&rsqb;MYSQL 與 Oracle 之間的數據類型轉換

rad linux下安裝mysql_Linux(CentOS或RadHat)下MySQL源碼安裝

MySQL 5.6開始&#xff0c;需要使用g進行編譯。cmake &#xff1a;MySQL 5.5開始&#xff0c;使用cmake進行工程管理&#xff0c;cmake需要2.8以上版本。bison &#xff1a;MySQL語法解析器需要使用bison進行編譯。ncurses-devel &#xff1a;用于終端操作的開發包。zlib …

mysql5.1數據庫亂碼_MySql5.1以上版本中文亂碼的解決方法

在my.cnf內添加以下代碼輸出err日志信息&#xff1a;[safe_mysqld]err-log /var/log/mysqld.logpid-file /var/lib/mysql/localhost.localdomain.pid在shell中輸入/bin/sh /usr/bin/mysqld_safe &啟動mysql&#xff0c;shell輸出如下&#xff1a;110328 11:39:55 mysqld_…

mysql 命令行批量sql_命令行中執行批量SQL的方法

基礎信息介紹測試庫&#xff1a;test&#xff1b;測試表&#xff1a;user&#xff1b;user表定義&#xff1a;CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,name char(30) NOT NULL,age int(11) NOT NULL,gender tinyint(1) DEFAULT 1 COMMENT 性別:1男&#xff1b;…

mysql雙主數據一致性_MySQL雙主一致性架構優化 | 架構師之路-阿里云開發者社區...

一、雙主保證高可用MySQL數據庫集群常使用一主多從&#xff0c;主從同步&#xff0c;讀寫分離的方式來擴充數據庫的讀性能&#xff0c;保證讀庫的高可用&#xff0c;但此時寫庫仍然是單點。在一個MySQL數據庫集群中可以設置兩個主庫&#xff0c;并設置雙向同步&#xff0c;以冗…

spool導出姓名中文亂碼_MySQL不同字符集轉化標準—7步實現,杜絕亂碼!

引言作為資深的DBA程序員&#xff0c;在工作中是否會遇到更這樣的情況呢&#xff1f;原有數據庫的字符集由于前期規劃不足&#xff0c;隨著業務的發展不能滿足業務的需求。如原來業務系統用的是utf8字符集&#xff0c;后期有存儲表情符號的需求&#xff0c;uft8字符集就不能滿足…

appium和airtest_關于Airtest自動化測試工具

一開始知道Airtest大概是在年初的時候&#xff0c;當時&#xff0c;看了一下官方的文檔&#xff0c;大概是類似Sikuli的一個工具&#xff0c;主要用來做游戲自動化的&#xff0c;通過截圖的方式用來解決游戲自動化測試的難題。最近&#xff0c;移動端測試的同事嘗試用它的poco庫…

easyexcel 設置標題_使用easyexcel完成復雜表頭及標題的導出功能(自定義樣式)

如需客戶端指定excel版本,只需要判斷后綴名然后在controller中的.excelType(ExcelTypeEnum.XLS)做指定輸出內容格式即可***(注意表格行高列寬統一設置是在實體類的類名注解上,如果需要對表格進行精細的寬高設置需要刪除掉這兩個注解,可以在攔截器使用row的方法進行設置)1. ## 引…

mysql distinct兩列_正在檢索兩列,并對MySQL中的每列應用“distinct”

這是一張桌子books----------------------------| author_fname | author_lname |----------------------------| Dan | Harris || Freida | Harris || George | Saunders |----------------------------我知道如果DISTINCT用作SELECT DISTINCT author_fname, author_lname FRO…