JMS實現之ActiveMQ

聲明:部分內容來自於互聯網 不完全原創 但都經過本人實測


簡介

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內

	

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章