聲明:部分內容來自於互聯網 不完全原創 但都經過本人實測
簡介
ActiveMQ是JMS的實現
目的:爲了系統與系統之間的解耦和通信
消息形式:
1、點對點 生產者--消費者 隊列模式 Queue
2、發佈/訂閱 生產者---多個消費者 廣播模式 Topic
兩種模式的區別
Queue:消息發出後緩存再服務器端 有客戶端上線 即可讀取
Topic:消息發佈時 不在線的服務端將不會接收到消息 即不會緩存再服務端
安裝ActiveMQ
1、上傳gz包 或者 wget
2、解壓
3、開啓ActiveMQ服務 ActiveMQ/bin/activemq start
jetty默認端口 8161
服務默認端口 61616
管理面板默認密碼 admin admin
ActiveMQ下載地址
http://activemq.apache.org/download-archives.html
注意:服務器機器名有下劃線 ActiveMQ是啓動不了的
需要修改/activeMQ/conf/activemq.xml 把0.0.0.0改爲127.0.0.1
把61616端口的改成0.0.0.0 否則外網連接不了
再修改jetty.xml中的host爲外網ip
ActiveMQ 依賴JDK版本(非常重要,JDK對應不上 、高版本編譯,低版本JDK上是運行不了的)
MQ版本號 |
Build-Jdk |
依賴JDK |
apache-activemq-5.0.0 |
1.5.0_12 |
1.5+ |
apache-activemq-5.1.0 |
1.5.0_12 |
1.5+ |
apache-activemq-5.2.0 |
1.5.0_15 |
1.5+ |
apache-activemq-5.3.0 |
1.5.0_17 |
1.5+ |
apache-activemq-5.4.0 |
1.5.0_19 |
1.5+ |
apache-activemq-5.5.0 |
1.6.0_23 |
1.6+ |
apache-activemq-5.6.0 |
1.6.0_26 |
1.6+ |
apache-activemq-5.7.0 |
1.6.0_33 |
1.6+ |
apache-activemq-5.8.0 |
1.6.0_37 |
1.6+ |
apache-activemq-5.9.0 |
1.6.0_51 |
1.6+ |
apache-activemq-5.10.0 |
1.7.0_12-ea |
1.7+ |
apache-activemq-5.11.0 |
1.7.0_60 |
1.7+ |
apache-activemq-5.12.0 |
1.7.0_80 |
1.7+ |
apache-activemq-5.13.0 |
1.7.0_80 |
1.7+ |
apache-activemq-5.14.0 |
1.7.0_80 |
1.7+ |
apache-activemq-5.15.0 |
1.8.0_112 |
1.8+ |
如何查看官方發佈ActiveMQ依賴JDK版本
以版本 apache-activemq-5.15.0 爲例
方法1:查看 release-note
ActiveMQ 5.15.0 Release Java 8 Required The minimum Java version has been upgraded to Java 8.
方法2:查看文件 activemq-all-*.jar\META-INF\MANIFEST.MF 屬性值 Build-Jdk
Manifest-Version: 1.0 Implementation-Title: ActiveMQ :: All JAR bundle Implementation-Version: 5.15.0 Archiver-Version: Plexus Archiver Built-By: cshannon Specification-Vendor: The Apache Software Foundation Specification-Title: ActiveMQ :: All JAR bundle Implementation-Vendor-Id: org.apache.activemq Implementation-Vendor: The Apache Software Foundation Main-Class: org.apache.activemq.console.command.ShellCommand Created-By: Apache Maven 3.5.0 Build-Jdk: 1.8.0_112 Specification-Version: 5.15.0
示例Java手動連接ActiveMQ
先導入activemq相關依賴包 用maven倉庫的 不要用安裝包中的activemq.jar!!!
// QUeue模式
@Test
public void testQueue() throws Exception {
// 1 創建連接工廠對象
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.133:61616");
// 2 使用工廠創建連接
Connection connection = factory.createConnection();
// 3 開啓連接
connection.start();
// 4 用連接獲取一個Session 第一個參數 是是否使用分佈式緩存 一般不用 保證事務最終一致,使用ActiveMQ可以實現
// 第二個參數是應答模式 一般設置自動應答 如果第一個參數爲true 第二個參數可以忽略
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5 使用session對象創建一個Destination 這個有兩種形式 就是queue和topic
Queue queue = session.createQueue("test1"); // 消息的名稱
// 6 使用session創建一個Producer對象
MessageProducer producer = session.createProducer(queue);
// 7 創建TextMessage對象和消息體
TextMessage message = session.createTextMessage("nihao queue");
// 8 發送消息
producer.send(message);
// 9 關閉資源
session.close();
producer.close();
connection.close();
}
// 接收Queue消息 Consumer
@Test
public void reciveQueue() throws Exception {
// 創建一個工廠
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.133:61616");
// 從工廠獲取connection
Connection connection = factory.createConnection();
// 開啓連接
connection.start();
// 創建一個session對象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 使用session創建一個Destination
Queue queue = session.createQueue("test1"); // 指定監聽的消息名稱
// 使用session創建一個Consumer
MessageConsumer consumer = session.createConsumer(queue);
// 給consumer添加監聽
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message arg0) {
// TODO Auto-generated method stub
// 如果此消息是TextMessage類型 直接強轉
if (arg0 instanceof TextMessage) {
TextMessage msg = (TextMessage) arg0;
try {
String text = msg.getText();
System.out.println(text);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
// 讓其一直監聽 不停止程序
System.in.read();
// 關閉連接
consumer.close();
session.close();
connection.close();
}
整合Spring
我這裏示例的是XML方式 現在都是springboot+註解+配置的方式 一切都簡化了 下面這種方式只是瞭解整合spring的過程 其實springboot在初始化JMS以及後續註解上都是下面這些流程。
發送方
<!-- 創建Activemq的工廠類 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg name="brokerURL" value="tcp://192.168.25.133:61616"></constructor-arg>
</bean>
<!-- 使用Spring引用(這是真正的工廠) -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"></property>
</bean>
<!-- 創建JMSTEMplate -->
<bean id="jmsTemplete" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg name="connectionFactory" ref="connectionFactory"></constructor-arg>
</bean>
<!-- 創建Destination目標 指定隊列名稱 -->
<bean id="queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="test-queue"></constructor-arg>
</bean>
<bean id="itemadd-topic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg name="name" value="itemadd-topic"></constructor-arg>
</bean>
==================
// 注入一個JMStemplate發送消息
@Autowired
private JmsTemplate jmsTemplete;
// 根據id注入一個Destination 由於這裏有兩個一樣的類型的Destination 所以使用名稱注入
@Resource(name = "itemadd-topic")
private Destination topic;
// 添加成功 使用ActiveMQ發送消息到服務器
jmsTemplete.send(topic, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
// TODO Auto-generated method stub
TextMessage message = session.createTextMessage(itemId + "");
return message;
}
});
=====================================================================================
接收方
<!-- 創建Activemq的工廠類 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg name="brokerURL" value="tcp://192.168.25.133:61616"></constructor-arg>
</bean>
<!-- 使用Spring引用(這是真正的工廠) -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory" ref="targetConnectionFactory"></property>
</bean>
<!-- 創建Destination目標 指定隊列名稱 -->
<bean id="test-queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="test-queue"></constructor-arg>
</bean>
<bean id="itemadd-topic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg name="name" value="itemadd-topic"></constructor-arg>
</bean>
<!-- 配置消息接收 -->
<!-- <bean id="messageListener" class="com.taotao.search.mqlistener.MessageListener"></bean> -->
<!-- 處理消息的Listenter -->
<bean id="itemAddMessageListener" class="com.taotao.search.mqlistener.ItemAddMessageListener"></bean>
<bean
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="destination" ref="itemadd-topic"></property>
<property name="messageListener" ref="itemAddMessageListener"></property>
</bean>
接收到信息的業務邏輯寫在Listener內