ActiveMQ入門

我不要·~~~404發表於2020-12-29

首先了解的名稱縮寫:

MOM:Message-oriented middleware,面向訊息中介軟體

是用於分散式應用或者系統中的非同步、鬆耦合、可靠、可擴充套件性和安全通訊的一類軟體。總體思想是它作為訊息的接收器和傳送器之間的訊息中介,提供了一個全新水平的鬆耦合。

基於JMS實現的MOM,又被稱為JMSProvider

JMS:Java Message Service,java訊息服務

最初的目的是為了使應用程式能夠訪問現有的MOM系統,後來被許多現有的MOM供應商採用,並實現為MOM系統。

是Java平臺上有關面向MOM的技術規範,旨在通過提供標準的產生、傳送、接收和處理訊息的API簡化企業應用的開發、類似於JDBC和關係型資料庫通訊方式的抽象。

JMS中的一些角色

Broken:就是Active啟動的一個例項,一個節點,一個訊息伺服器,作為server提供訊息核心服務

provider:生產者,訊息生產者是由會話建立的一個物件,用於把訊息傳送到一個目的地。純Java語言編寫的JMS介面實現(比如ActiveMQ就是)。

consumer:消費者,是由會話建立的一個物件,它用於接收傳送目的地的訊息。分為兩種:
同步消費。通過呼叫消費者的receive方法從目的地中顯示提取訊息。receive方法可以一直阻塞到訊息到達。
非同步消費。客戶可以為消費者註冊一個訊息監聽器,以定義在訊息到達時所採取的動作。

P2P:基於點對點的訊息模型(使用queue作為destination)
訊息生產者生產訊息傳送到queue中,然後訊息消費者從queue中取出並且消費訊息。訊息被消費以後,queue中不再有儲存,所以消費者不可能消費到以及被消費的訊息。
queue支援存在多個消費者,但是對於一個訊息來說,只會有一個消費者可以消費、其他的則不能消費此訊息了。當消費者不存在是,消費會一直存在,直到有消費者消費。

PUB/SUB:基於訂閱/釋出的訊息模型(訊息域使用topic作為destination)
訊息生產者(釋出)將訊息釋出到topic中,同時有多個訊息消費者(訂閱)消費該訊息。
和點對點方式不同,釋出到topic的訊息會被所有訂閱者消費。當生產者釋出訊息,不管是否有消費者。都不會儲存訊息,一定要先有訊息的消費者,後有訊息的生產者。
在這裡插入圖片描述

ActiveMQ

實現了JMS規範的系統間遠端通訊的訊息代理。

建立應用程式的步驟:

  1. 獲取連線工廠
  2. 使用連線工廠建立連線
  3. 啟動連線
  4. 從連線建立會話
  5. 獲取destination
  6. 建立producer,或建立message
  7. 建立consumer,或傳送或接受message,註冊訊息監聽器(可選)
  8. 傳送或接受message
  9. 關閉資源(connection、session、producer、consumer等)
// 傳送方
public class Sender {

	public static void main(String[] args) throws JMSException, InterruptedException {

		// 1.獲取連線工程

		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD,
				"tcp://localhost:61616");

		// 2.獲取一個向ActiveMQ的連線
		Connection connection = connectionFactory.createConnection();
		
		// 3.獲取session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 4.找目的地,獲取destination,消費端,也會從這個目的地取訊息
		Queue queue = session.createQueue("user");
		// 5.1 訊息建立者
		MessageProducer producer = session.createProducer(queue);
		// consumer -> 消費者
		// producer -> 建立者
		// 5.2.建立訊息
		for (int i = 0; i < 100; i++) {
			TextMessage textMessage = session.createTextMessage(i + "、 hi");
			// 5.3.向目的地寫入訊息
			producer.send(textMessage);
			Thread.currentThread().setName("MyThread" + i);
			System.out.println(Thread.currentThread().getName());
		}

		// 6.關閉連線
		connection.close();
		System.out.println("System exit...");
	}
// 接收方
public class Receiver {

	public static void main(String[] args) throws JMSException {
		// 1.獲取連線工程

		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD,
				"tcp://localhost:61616");

		// 2.獲取一個向ActiveMQ的連線
		Connection connection = connectionFactory.createConnection();
		connection.start();
		// 3.獲取session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 4.找目的地,獲取destination,消費端,也會從這個目的地取訊息
		Destination queue = session.createQueue("user");
		// 5.獲取訊息

		MessageConsumer consumer = session.createConsumer(queue);

		while (true) {
			TextMessage message = (TextMessage) consumer.receive();
			System.out.println("message:" + message.getText());
		}

		/*
		 * // 6.關閉連線 connection.close(); System.out.println("System exit...");
		 */

	}

ActiveMQ 常用的儲存方式

1、KahaDB
ActiveMQ 5.3 版本起的預設儲存方式。KahaDB儲存是一個基於檔案的快速儲存訊息,設計目標是易於使用且儘可能快。它使用基於檔案的訊息資料庫意味著沒有第三方資料庫的先決條件。

要啟用 KahaDB 儲存,需要在 activemq.xml 中進行以下配置:

1 <broker brokerName="broker" persistent="true" useShutdownHook="false">
2         <persistenceAdapter>
3                 <kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
4         </persistenceAdapter>
5 </broker>

2、AMQ
與 KahaDB 儲存一樣,AMQ儲存使使用者能夠快速啟動和執行,因為它不依賴於第三方資料庫。AMQ 訊息儲存庫是可靠永續性和高效能索引的事務日誌組合,當訊息吞吐量是應用程式的主要需求時,該儲存是最佳選擇。但因為它為每個索引使用兩個分開的檔案,並且每個 Destination 都有一個索引,所以當你打算在代理中使用數千個佇列的時候,不應該使用它。

<persistenceAdapter>
        <amqPersistenceAdapter
                directory="${activemq.data}/kahadb"
                syncOnWrite="true"
                indexPageSize="16kb"
                indexMaxBinSize="100"
                maxFileLength="10mb" />
</persistenceAdapter>

3、JDBC
選擇關係型資料庫,通常的原因是企業已經具備了管理關係型資料的專長,但是它在效能上絕對不優於上述訊息儲存實現。事實是,許多企業使用關聯式資料庫作為儲存,是因為他們更願意充分利用這些資料庫資源。

<beans>
        <broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
                <persistenceAdapter>
                        <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
                </persistenceAdapter>
        </broker>
        <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
                <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
                <property name="username" value="activemq"/>
                <property name="password" value="activemq"/>
                <property name="maxActive" value="200"/>
                <property name="poolPreparedStatements" value="true"/>
        </bean>
</beans>

4.記憶體儲存
記憶體訊息儲存器將所有持久訊息儲存在記憶體中。在僅儲存有限數量 Message 的情況下,記憶體訊息儲存會很有用,因為 Message 通常會被快速消耗。在 activema.xml 中將 broker 元素上的 persistent 屬性設定為 false 即可

1 <broker brokerName="test-broker" persistent="false" xmlns="http://activemq.apache.org/schema/core">
2         <transportConnectors>
3                 <transportConnector uri="tcp://localhost:61635"/>
4         </transportConnectors>
5 </broker>

ActiveMQ 的部署模式

1.單例模式
2.無共享主從模式
3.共享儲存主從模式

ActiveMQ 的網路連線

1.代理網路
2.網路發現

相關文章