ActiveMQ初級教程

年華是封無效信發表於2014-05-20
MQ的思想其實和連線池差不多,只不過一個是佇列,一個是多執行緒。設計模式和原理都類似,ActiveMQ(以下簡稱amq)實際上是封裝了JMS,所以可以在amq裡直接使用很多JMS的物件。

去官網去下載 關於amq的安裝 so easy 我就不多說了 網上一搜一堆 需要注意的是下載的時候可能會有各種404問題 官網提供了很多的下載URL 國內的網路河蟹 很難下載 你可以換一個其他版本試試 (我就是這樣的)

JMS裡分為生產者(Producer)和消費者(Consumer)

生產者向佇列add data
消費者向佇列poll data

我來簡單介紹幾個MQ重要的物件

ActiveMQConnectionFactory : 實現了jms的ConnectionFactory,Connection的工廠類
Connection :JMS連線,和Java連線池的Connection差不多 Producer和Consumer用來和Broker通訊的
Session : 會話
Destination :目的地,資料要傳送到哪裡或者從哪裡取
MessageProducer: 生產者
MessageConsumer :消費者
Message : 訊息,add到佇列的東西,也就是自己要處理的東西,Message有很多子介面,TextMessage或ByteMessage神馬的 自己根據自己的業務選擇介面

以上除了ActiveMQConnectionFactory 是amq的類(實現JMS) 其他的基本都是JMS自己的介面 所以我們在程式碼裡直接使用的介面 因為除了ActiveMQConnectionFactory需要我們建立 其他的物件都不需要我們手動去建立


Producer

ConnectionFactory factory; //連線工廠
Connection connection;//jms連線
Session session;//傳送、接收執行緒
Destination destination;//訊息目的地
MessageProducer producer;//訊息傳送者

factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616"); //獲取工廠例項

/**
* 以上步驟可使用單例模式等方法,讓ActiveMQConnectionFactory始終只建立一次(和SessionFactory的性質差不多)
*/

try {
connection = factory.createConnection(); //獲取Connection
connection.start(); //開啟Connection
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); //建立Session並選擇事務和ACK模式
destination = session.createQueue("rdp_import_queue"); //根據自己的佇列名稱建立Destination(如果沒有佇列,MQ會自己建立佇列)
producer = session.createProducer(destination); //建立生產者
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //是否為持久化 ,NON_PERSISTENT非持久化 ,PERSISTENT持久化

for (int i = 1; i < 13; i++) {
String msg = "第" + i + "次傳送訊息";
TextMessage textMessage = session.createTextMessage(msg);
producer.send(textMessage);
}

//關閉物件
producer.close();
session.commit();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}



Consumer 下面就不寫註釋了 和上面一樣


connection = factory.createConnection();
connection.start();
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("rdp_import_queue");
consumer = session.createConsumer(destination); // 建立Consumer
while (true) {
TextMessage textMessage = (TextMessage) consumer.receive(); // 接收Message
if (textMessage != null && !textMessage.getJMSRedelivered()) { //檢查是否已經接收過
System.out.println(textMessage.getText());
textMessage.acknowledge(); //通知已接收
}
Thread.sleep(1000);
}



有幾個地方要注意一下
1、ConnectionFactory的生命週期 此物件不要頻繁建立 全域性建立一個就好 每次用該物件獲取Connection就好了

1、DeliveryMode 持久化方式,開發中可以選擇對Message是否要做持久化,持久化的Message在重啟amq後還會依然存在,非持久化會自動被幹掉(但是會臨時存放於amp),
其值為NON_PERSISTENT非持久化 ,PERSISTENT持久化

2、ACK(Acknowledgement),先說下什麼是ACK,ACK即確認字元,在資料通訊中,接收站發給傳送站的一種傳輸類控制字元。表示發來的資料已確認接受無誤。ACK訊號通常是一個ASCII字元,不同的協議中ACK訊號都不一樣。
當Consumer拿到Message之後要通知Broker已確認接收,否則其他Consumer會認為該Message依然可用,JMS的Session中提供了四種ACK_MODE
AUTO_ACKNOWLEDGE = 1 自動確認
CLIENT_ACKNOWLEDGE = 2 客戶端手動確認
DUPS_OK_ACKNOWLEDGE = 3 自動批量確認
SESSION_TRANSACTED = 0 事務提交併確認

AcitveMQ對此補充了一個自定義的ACK_MODE: INDIVIDUAL_ACKNOWLEDGE = 4 單條訊息確認

相關文章