ActiveMQ 學習一 入門篇
實際應用中有多種MQ,包括MSMQ,Active MQ,Jboss MQ等。其中ActiveMQ是一個開源的JMS服務器,本文簡單介紹java環境下Active MQ入門。
準備工作
1、下載ActiveMQ
http://pan.baidu.com/s/1c1qwlJq 我下載的是apache-activemq-5.13.2,下載後解壓縮即可。
2、啓動ActiveMQ
在bin目錄下,找到activemq.bat命令,雙擊啓動即可。其中需要注意的是,如果是64位機器,需要啓動win64文件夾下的activemq.bat命令。
3、測試是否啓動成功
在瀏覽器輸入http://localhost:8161/admin 用戶名/密碼:admin/admin。
這些都是默認配置,都可以在conf文件夾中進行配置。我們先用默認的進行測試就行了
4、簡單java測試項目
/**
* 消息產生者向JMS發送消息的步驟
(1)創建連接使用的工廠類JMS ConnectionFactory
(2)使用管理對象JMS ConnectionFactory建立連接Connection
(3)使用連接Connection 建立會話Session
(4)使用會話Session和管理對象Destination創建消息生產者MessageSender
(5)使用消息生產者MessageSender發送消息
* @throws JMSException
*/
public class SendMessage {
protected String expectedBody = "<hello>world!</hello>";
public void sendMessage() throws JMSException{
//ConnectionFactory:連接工廠,JMS用它創建連接
ConnectionFactory connectionFactory = null;
//Connection:JMS客戶端到JMS Provider的連接
Connection connection =null;
//Session:一個發送或接收信息的線程
Session session = null;
//Destination:消息的目的地,消息發送給誰
Destination destination = null;
//MessageProducer:消息發送者
MessageProducer producer = null;
try{
connectionFactory =new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,Constants.URL);
connection = (Connection)connectionFactory.createConnection();
connection.start();
session = (Session)connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue(Constants.QUEUE_NAME);
producer = session.createProducer(destination);
//設置不持久化,此處可根據實際項目決定
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//TextMessage:消息體
// TextMessage message = session.createTextMessage(expectedBody);
// message.setStringProperty("headname", "remoteB");
// producer.send(message);
sendMessage(session,producer);
session.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
if(null!=connection){
connection.close();
}
}
}
private static void sendMessage(Session session, MessageProducer producer) throws JMSException {
for(int i=1;i<=Constants.SEND_NUMBER;i++){
TextMessage message = session.createTextMessage("ActiveMq發送的消息"+i);
producer.send(message);
}
}
public static void main(String[] args){
SendMessage sndMsg = new SendMessage();
try{
sndMsg.sendMessage();
}catch(Exception ex){
System.out.println(ex.toString());
}
}
}
/**
* 消息消費者從JMS接受消息的步驟
(1)創建連接使用的工廠類JMS ConnectionFactory
(2)使用管理對象JMS ConnectionFactory建立連接Connection
(3)使用連接Connection 建立會話Session
(4)使用會話Session和管理對象Destination創建消息消費者MessageReceiver
(5)使用消息消費者MessageReceiver接受消息,需要用setMessageListener將MessageListener接口綁定到MessageReceiver
消息消費者必須實現了MessageListener接口,需要定義onMessage事件方法。
*/
public class ReceiveMessage {
public void receiveMessage() {
//JMS用它創建連接
ConnectionFactory connectionFactory = null;
//JMS客戶端到JMS Provider的連接
Connection connection = null;
//一個發送或接收消息的線程
Session session = null;
//消息目的地
Destination destination = null;
//消費者,消息接收者
MessageConsumer consumer;
try {
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,Constants.URL);
connection = connectionFactory.createConnection();
connection.start();
/**在connection的基礎上創建一個session,同時設置是否支持事務ACKNOWLEDGE標識。
• AUTO_ACKNOWLEDGE:自動確認模式。一旦接收方應用程序的方法調用從處理消息處返回,會話對象就會確認消息的接收。
• CLIENT_ACKNOWLEDGE:客戶端確認模式。會話對象依賴於應用程序對被接收的消息調用一個acknowledge()方法。一旦這個方法被調用,會話會確認最後一次確認之後所有接收到的消息。這種模式允許應用程序以一個調用來接收,處理並確認一批消息。注意:在管理控制檯中,如果連接工廠的Acknowledge Policy(確認方針)屬性被設置爲"Previous"(提前),但是你希望爲一個給定的會話確認所有接收到的消息,那麼就用最後一條消息來調用acknowledge()方法。
• DUPS_OK_ACKNOWLEDGE:允許副本的確認模式。一旦接收方應用程序的方法調用從處理消息處返回,會話對象就會確認消息的接收;而且允許重複確認。在需要考慮資源使用時,這種模式非常有效。注意:如果你的應用程序無法處理重複的消息的話,你應該避免使用這種模式。如果發送消息的初始化嘗試失敗,那麼重複的消息可以被重新發送。
• SESSION_TRANSACTED
**/
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue(Constants.QUEUE_NAME);
consumer = session.createConsumer(destination);
consumeMessagesAndClose(connection, session, consumer);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.toString());
}
}
protected void consumeMessagesAndClose(Connection connection,Session session, MessageConsumer consumer)
throws JMSException {
for (int i = 0; i <=Constants.SEND_NUMBER;i++) {
Message message = consumer.receive(1000);
if (message != null) {
i++;
onMessage(message);
}
}
System.out.println("Closing connection");
consumer.close();
session.close();
connection.close();
}
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage txtMsg = (TextMessage) message;
String msg = txtMsg.getText();
System.out.println("Received: " + msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
ReceiveMessage rm = new ReceiveMessage();
rm.receiveMessage();
}
}
public class Constants {
public static final String URL = "tcp://localhost:61616";
public static final String QUEUE_NAME = "choice.queue";
public static int SEND_NUMBER = 5;
}
Jar包管理:
a.可以引入maven依賴
<!-- activeMQ -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.13.2</version>
</dependency>
b.導入 activemq-all-5.13.2.jar
5運行項目
首先,運行SendMessage的main主函數,沒有錯誤後,刷新主頁面,可以看到隊列choice.queue中有5條消息。
第二,運行ReceiveMessage的Main主函數,效果如下圖:
第三,刷新主頁面,可以看到隊列中爲讀消息變成2條:
後記:簡單的activeMQ入門篇就到這裏啦,下期第二篇開講springmvc集成activeMQ,敬請關注。