目錄
ActiveMQ 簡介
1、ActiveMQ 是 Apache 推出的一款開源免費的,完全支持 JMS1.1 和 J2EE 1.4 規範的 JMS Provider 實現的消息中間件(Message Oriented Middleware,MOM)
2、ActiveMQ 最主要的功能是實現 JMS Provider ,用來幫助實現高可用、高性能、可伸縮、易用和安全的企業級面向消息服務的系統。
ActiveMQ 官網:http://activemq.apache.org/index.html
ActiveMQ 下載地址:http://activemq.apache.org/download-archives
3、ActiveMQ 特點/性:
完全支持 JMS1.1 和 J2EE 1.4 規範(持久化、XA消息、事物)
支持多種傳輸協議:in-VM,TCP,UDP,SSL,NIO,JGroup,JXTA
可插拔的體系結構,可以靈活定製,如:消息存儲方式,安全管理等
可以輕鬆與 Application Server 集成使用,與 Spring 集成使用
支持多種語言編寫客戶端:如 Java、C、C++、C#、Ruby、Perl、Python、php、.net 等
從設計上保證了高性能的集羣,客戶端-服務端,點對點
支持通過 JDBC、Journal 提供高速的消息持久化
支持與 Axis 的整合。...
4、消息中間件(MOM)的基本功能是將信息以消息的形式,從一個應用程序傳送到另一個或多個應用程序。主要特點/特性:
消息異步接收,類似手機短信,信息發送者不需要等待信息接受者的響應,減少軟件多系統集成的耦合度。
消息的可靠接收,確保消息在中間件可靠保存,只有接收方收到後才刪除消息,多個消息也可以組成原子事物。
5、目前主流的消息中間件:Apache ActiveMQ、alibaba RocketMQ、Kafka、RabbitMQ、IBM MQServices、BEA WebLogic JMS Server、Oracle AQ、Tibco、SwiftMQ。
ActiveMQ 5.15.9 安裝
1、官網地址 http://activemq.apache.org/download-archives 可以下載任意歷史版本,本文以最新的 5.15.9 爲例。
5.15.9 版本默認情況下啓用 activemq 客戶端 tls 主機名驗證,這可能會導致與服務器主機名不匹配的服務器證書的客戶端連接失敗。請參閱 SSL 傳輸參考以瞭解配置,並參閱AMQ-7047以瞭解更多信息。
Description | Download Link | Verify |
---|---|---|
Windows Distribution | apache-activemq-5.15.9-bin.zip | ASC, SHA512 |
Unix/Linux/Cygwin Distribution | apache-activemq-5.15.9-bin.tar.gz | ASC, SHA512 |
2、對於 Maven 項目,可以使用 maven 3 獲取二進制文件,可以在 maven pom.xml 中使用的最簡單依賴項是:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
activemq-all 包含了所有的組件,如果只是需要其中某一部分功能,想要更細粒度的獲取依賴,則可以從 activemq-client, activemq-broker, activemq-xx-store 等各種組件中進行選擇。
3、根據系統需要可以下載 Windows 或 Linux 版本的二進制發行包,下載後直接解壓拷貝到合適的地方即可,裏面提供了開發包、運行程序、配置文件、文檔、示例等等。
4、啓動運行(嵌入式啓動可以參考:ActiveMQ 命令行啓動 與 嵌入式啓動):
默認配置啓動:進入 %ActiveMQ_HOME%/bin目錄下,執行:activemq start (默認日誌文件放在 data 目錄下)
啓動並指定日誌文件:進入 %ActiveMQ_HOME%/bin目錄下,執行:activemq start > ./activeMQLog.log
5、檢查運行狀態,ActiveMQ 默認採用 61616 端口提供 JMS 服務,使用 8161 端口提供管理控制檯服務:
Windows 查看 61616 端口是否開啓:netstat -ano |findstr 61616
Linux 查看 61616 端口是否開啓:netstat -ano |grep 61616
可以直接查看控制檯輸出或者日誌文件
可以直接訪問 ActiveMQ 的 web 管理頁面:http://localhost:8161/admin;默認賬號密碼是 admin/admin
6、關閉 ActiveMQ:
進入 %ActiveMQ_HOME%/bin目錄下,執行:activemq stop
關閉啓動窗口,程序也會退出
雖然不建議,但直接殺進程也是一種方式
ActiveMQ 基本使用
1、通俗的說 A 系統/應用可以將消息/數據 存儲到 mysql 、redis 等數據庫服務器上,B 系統/應用再從上面讀取,也能起到中間件的作用,只是 ActiveMQ 可以看成是一個專門用於處理消息的數據庫/服務器,消息生產者將消息發送給它,消息消費者再從 ActiveMQ 上讀取。
2、正式因爲 ActiveMQ 是專業的消息中間件,所以使用起來非常簡單:
1)新建一個 Mava 管理的 Java SE 應用,在 pom.xml 文件導入上面的 activemq-all 依賴
2)然後新建一個生產者類(JmsSender)用於生產消息(消息會被髮送到 ActiveMQ)
3)再新建一個消費者類(JmsReceiver)用於消費消息(會從 ActiveMQ 上讀取消息)。
環境:Maven 3.6.1 + Java JDK 1.8 + ActiveMQ 5.15.9 + IDEA 2018
pom.xml 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wmx</groupId>
<artifactId>activeMQ1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
</dependencies>
</project>
生產者(JmsSender)代碼如下:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息發送者
*/
public class JmsSender {
public static void main(String[] args) {
Connection connection = null;
Session session = null;
try {
String brokerURL = "tcp://127.0.0.1:61616";//ActiveMQ 中間件連接地址
/**
* 創建 javax.jms.ConnectionFactory 連接工廠
* org.apache.activemq.ActiveMQConnectionFactory 中默認設置了大量的參數,還有幾個重載的構造器可以選擇
*/
ConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory(brokerURL);
//如果 ActiveMQ 連不上,則拋異常:java.net.ConnectException: Connection refused: connect
connection = mqConnectionFactory.createConnection();//通過連接工廠獲取連接 javax.jms.Connection
connection.start();//啓動連接,同理還有 stop、close
/**
* Session createSession(boolean transacted, int acknowledgeMode) 創建會話
* transacted :表示是否開啓事務
* acknowledgeMode:表示會話確認模式
* AUTO_ACKNOWLEDGE 自動確認
* CLIENT_ACKNOWLEDGE 客戶確認
* 還有 DUPS_OK_ACKNOWLEDGE、SESSION_TRANSACTED
*/
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
/**
* createQueue(String queueName):創建消息隊列,指定隊列名稱,消費者可以根據隊列名稱獲取消息
* Destination 目的地,重點,interface Queue extends Destination
*/
Destination destination = session.createQueue("queue-app");
//createProducer(Destination destination):根據目的地創建消息生產者
MessageProducer producer = session.createProducer(destination);
int massageTotal = 5;
for (int i = 0; i < massageTotal; i++) {
//創建一個文本消息
TextMessage textMessage = session.createTextMessage("神州飛船 " + (i + 1) + " 號!");
producer.send(textMessage);//生產者發送消息
session.commit();//會話提交
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (session != null) {
try {
session.close();//關閉會話
} catch (JMSException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();//關閉連接
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
消費者(JmsReceiver)代碼如下:
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 消息消費者
*/
public class JmsReceiver {
public static void main(String[] args) {
Connection connection = null;
Session session = null;
try {
String brokerURL = "tcp://127.0.0.1:61616";//ActiveMQ 中間件連接地址
/**
* 創建 javax.jms.ConnectionFactory 連接工廠
* org.apache.activemq.ActiveMQConnectionFactory 中默認設置了大量的參數,還有幾個重載的構造器可以選擇
*/
ConnectionFactory mqConnectionFactory = new ActiveMQConnectionFactory(brokerURL);
//如果 ActiveMQ 連不上,則拋異常:java.net.ConnectException: Connection refused: connect
connection = mqConnectionFactory.createConnection();//通過連接工廠獲取連接 javax.jms.Connection
connection.start();//啓動連接,同理還有 stop、close
/**
* Session createSession(boolean transacted, int acknowledgeMode) 創建會話
* transacted :表示是否開啓事務
* acknowledgeMode:表示會話確認模式
* AUTO_ACKNOWLEDGE 自動確認
* CLIENT_ACKNOWLEDGE 客戶確認
* 還有 DUPS_OK_ACKNOWLEDGE、SESSION_TRANSACTED
*/
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
/**
* createQueue(String queueName):創建消息隊列,指定隊列名稱,消費者可以根據隊列名稱獲取消息
* Destination 目的地,重點,interface Queue extends Destination
*/
Destination destination = session.createQueue("queue-app");
//createProducer(Destination destination):根據目的地創建消息消費者
MessageConsumer consumer = session.createConsumer(destination);
int massageTotal = 5;
for (int i = 0; i < massageTotal; i++) {
TextMessage message = (TextMessage) consumer.receive();//消費者接收消息。因爲對方發送的文本消息,所以可以強轉
session.commit();//確認消息,告訴中間件,消息已經確認接收
System.out.println((i + 1) + ":" + message.getText());//獲取消息文本
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (session != null) {
try {
session.close();//關閉會話
} catch (JMSException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();//關閉連接
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
測試如下
1、先啓動 ActiveMQ 消息中間,然後運行消息發送者發送消息,此時 ActiveMQ web 控制檯可以看到管理的消息隊列,再運行消息消費者獲取消息。