想了解一下消息隊列的使用,因爲AMQ是使用較多的一個,所以就以AMQ爲對象瞭解學習。
首先是去官網下載,這裏要注意AMQ依賴的Java版本不一樣。像我一開始下載的最新的5.15版本,但是依賴的Java版本是1.8,而測試的機器使用的是1.7。無奈在查詢後又重新下載了5.14版本使用。
下載之後解壓,進入bin目錄下,如圖:
點擊win64下的activemq.bat腳本啓動AMQ服務。
這是啓動成功後的輸出信息。在服務啓動成功後可以通過http://127.0.0.1:8161/admin地址進入管理界面查看相關信息。
接下來就是寫測試代碼簡單的實驗一下消息隊列(這裏以P2P模式爲例):
首先是寫一個消息發佈者的類:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* AMQ消息發佈者
*
*
*/
public class AmqProducer {
// 發佈消息數量
private static final Integer SENDNUM = 7;
/**
* 發送消息的方法
*
* @param session
* @param producer
* @throws JMSException
*/
public static void sendMessage(Session session, MessageProducer producer) throws JMSException {
TextMessage message = null;
for (int i = 0; i < SENDNUM; i++) {
message = session.createTextMessage("AMQ message" + i);
producer.send(message);
}
}
public static void main(String[] args) {
// 連接工廠
ConnectionFactory connectionFactory;
// 連接
Connection connection = null;
// 會話
Session session;
// 消費地址
Destination destination;
// 發佈者
MessageProducer producer;
// 實例化連接工廠
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);
try {
// 獲取連接
connection = connectionFactory.createConnection();
// 啓動連接
connection.start();
// 創建會話
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 創建消息隊列
destination = session.createQueue("MyAmq");
// 創建發佈者
producer = session.createProducer(destination);
// 發送消息
sendMessage(session, producer);
// 事務提交
session.commit();
} catch (JMSException e) {
e.printStackTrace();
} finally {
// 關閉資源
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
這裏注意createSession(param1,param2)這個方法,這個方法的兩個參數param1是表示是否開啓事務,param2表示使用何種確認接收機制。
–param1設置爲false時,關閉事務:
param2的值可爲 Session.AUTO_ACKNOWLEDGE,Session. CLIENT_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE其中一個。
–param1設置爲true時,開啓事務:
param2可任意取值,因爲這裏確認機制會被默認爲SESSION_TRANSACTED(事務提交併確認)
這裏可以看出實際上事務和確認機制是互斥的,兩者取其一使用。
再來看看幾種確認機制的信息:
AUTO_ACKNOWLEDGE:自動確認機制,從字面上意思也可以猜到,當會話對接收到的每條信息都會自動發送確認信息,無需消費者進行確認操作。
CLIENT_ACKNOWLEDGE:客戶端確認機制,從字面上也很容易理解,也就是確認的操作要由消費者主動完成。從代碼上來說就是消費者必須調用javax.jms.Message的acknowledge方法發送接收確認。
DUPS_OK_ACKNOWLEDGE:可重複確認,這個機制主要是用在批量確認的場景中。具體執行方式其實和AUTO_ACKNOWLEDGE相似,不需要手動調用方法發送確認。這個機制在我理解看來類似於將多個自動確認的操作放在一次操作上進行。
上述是對機制的簡單的介紹,具體的可以百度詳細瞭解。
寫完發佈者後就是消費者的類了:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class AmqConsumer {
public static void main(String[] args) {
// 連接工廠
ConnectionFactory connectionFactory;
// 連接
Connection connection = null;
// 會話
Session session;
// 消費者
MessageConsumer consumer;
// 消費地址
Destination destination;
// 實例化連接工廠
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);
try {
// 從工廠獲取連接
connection = connectionFactory.createConnection();
// 啓動連接
connection.start();
// 創建session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 創建地址
destination = session.createQueue("MyAmq");
// 創建消費者
consumer = session.createConsumer(destination);
while (true) {
TextMessage message = (TextMessage) consumer.receive(10000);
if (message != null) {
System.out.println("接收消息:" + message);
} else {
break;
}
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
兩個類都寫完後,先運行發佈者。可以在監控平臺上的Queues菜單中看到發佈的消息數量及具體信息:
然後運行消費者的類:
後臺會輸出接收到的消息信息,然後進入監控平臺
因爲我沒有結束消費者的進程,所以這裏可以看到消費者的個數爲一。而待消費的消息數量已經清零了,同時已消費的消息數量增加了10個。表明消費成功。