ActiveMQ入門
首先了解的名稱縮寫:
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規範的系統間遠端通訊的訊息代理。
建立應用程式的步驟:
- 獲取連線工廠
- 使用連線工廠建立連線
- 啟動連線
- 從連線建立會話
- 獲取destination
- 建立producer,或建立message
- 建立consumer,或傳送或接受message,註冊訊息監聽器(可選)
- 傳送或接受message
- 關閉資源(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.網路發現
相關文章
- ActiveMQ 入門及例項MQ
- ActiveMQ從入門到精通(一)MQ
- ActiveMQ從入門到精通(二)MQ
- .Net平臺下ActiveMQ入門例項MQ
- ActiveMQ入門系列二:入門程式碼例項(點對點模式)MQ模式
- ActiveMQMQ
- 入門入門入門 MySQL命名行MySql
- 安裝activemqMQ
- ActiveMQ簡介MQ
- ActiveMQ第四彈:在HermesJMS中建立ActiveMQ SessionMQSession
- 如何入CTF的“門”?——所謂入門就是入門
- 何入CTF的“門”?——所謂入門就是入門
- ActiveMQ第二彈:使用Spring JMS與ActiveMQ通訊MQSpring
- scala 從入門到入門+
- makefile從入門到入門
- ACM入門之新手入門ACM
- Zabbix監控ActiveMQMQ
- ActiveMQ之StompMQ
- ActiveMQ嵌入TomcatMQTomcat
- ActiveMq整合SpringMQSpring
- ActiveMQ筆記整理MQ筆記
- ActiveMQ初步安裝MQ
- ActiveMQ使用簡介MQ
- activemq測試類MQ
- ActiveMQ 與 SpringMQSpring
- ActiveMQ+MQTT+WebSocketMQQTWeb
- ActiveMQ初級教程MQ
- ActiveMQ持久化方式MQ持久化
- ActiveMQ - message cursorMQ
- Spring 配置 ActiveMQSpringMQ
- 【小入門】react極簡入門React
- gRPC(二)入門:Protobuf入門RPC
- 淺談ActiveMQ與使用MQ
- Spring與ActiveMQ整合SpringMQ
- activeMQ個人理解總結MQ
- ActiveMq安裝和使用MQ
- ActiveMQ簡單介紹MQ
- ActiveMQ-mysql持久化MQMySql持久化