ActiveMq的簡介
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。
主要特點:
多種語言和協議編寫客戶端。語言: Java, C, C++, C#, Ruby, Perl, Python, PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
完全支持JMS1.1和J2EE 1.4規範 (持久化,XA消息,事務)。
對Spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統裏面去,而且也支持Spring2.0的特性。
通過了常見J2EE服務器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上。
支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA。
支持通過JDBC和journal提供高速的消息持久化。
從設計上保證了高性能的集羣,客戶端-服務器,點對點。
支持Ajax。
支持與Axis的整合。
可以很容易得調用內嵌JMS provider,進行測試。
基本概念
-
點對點模型(Point to Point) 使用隊列(Queue)作爲消息通信載體,滿足生產者與消費者模式,一條消息只能被一個消費者使用,未被消費的消息在隊列中保留直到被消費或超時。
-
發佈訂閱模型(Pub/Sub) 使用主題作爲消息通信載體,類似於廣播模式,發佈者發佈一條消息,該消息通過主題傳遞給所有的訂閱者,在一條消息廣播之後才訂閱的用戶則是收不到該條消息的。
基本組件
- Broker,消息代理,表示消息隊列服務器實體,接受客戶端連接,提供消息通信的核心服務。
- Producer,消息生產者,業務的發起方,負責生產消息並傳輸給 Broker 。
- Consumer,消息消費者,業務的處理方,負責從 Broker 獲取消息並進行業務邏輯處理。
- Topic,主題,發佈訂閱模式下的消息統一彙集地,不同生產者向 Topic 發送消息,由 Broker 分發到不同的訂閱者,實現消息的廣播。
- Queue,隊列,點對點模式下特定生產者向特定隊列發送消息,消費者訂閱特定隊列接收消息並進行業務邏輯處理。
- Message,消息體,根據不同通信協議定義的固定格式進行編碼的數據包,來封裝業務 數據,實現消息的傳輸。
activeMq安裝成功後進入web端頁面http://localhost:8161/admin/index.jsp
activeMq生產者代碼:
package com.data.activemq.producter;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MqProducter {
//默認連接用戶名
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默認連接密碼
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
//默認連接地址
private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
//連接工廠
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);
try {
//連接
Connection connection = connectionFactory.createConnection();
//啓動連接
connection.start();
//創建session
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//消息目的地
Destination destination = session.createQueue("hello");
//消息生產者
MessageProducer producer = session.createProducer(destination);
//設置不持久化,此處學習,實際根據項目決定
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//發送消息
for (int i = 0; i < 10; i++) {
//創建一條文本消息
TextMessage message = session.createTextMessage("ActiveMQ:這是第 " + i + " 條消息");
//生產者發送消息
producer.send(message);
}
session.commit();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
activeMq消費者代碼:
package com.data.activemq.comsumer;
import javax.jms.*;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MqComsumer {
//默認連接用戶名
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默認連接密碼
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
//默認連接地址
private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) {
//連接工廠
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);
try {
//連接
Connection connection = connectionFactory.createConnection();
//啓動連接
connection.start();
//創建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//消息目的地
Destination destination = session.createQueue("hello");
//消息消費者
MessageConsumer consumer = session.createConsumer(destination);
while (true) {
TextMessage message = (TextMessage) consumer.receive();
if (message != null) {
System.out.println("接收到消息: " + message.getText());
} else {
break;
}
}
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
配置文件配置avtiveMq信息:
生產者生產消息:
發送者發送消息: