SpringJms的使用

activeMQ是一種消息中間件,它分爲兩種模式:點對點和發佈與訂閱,當我們要處理大量的數據插入或者邏輯冗餘的時候,我們就可以用activeMQ來異步處理這些邏輯或者操作。下面是點對點模式

1.加入相關依賴

<dependencies>
     <dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jms</artifactId>
	</dependency>

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.9</version>
</dependency>
<dependency>
	<groupId>org.apache.activemq</groupId>
	<artifactId>activemq-client</artifactId>
	<version>5.13.4</version>
 </dependency>
 
 
 <dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-beans</artifactId>
</dependency>



<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
</dependency>
</dependencies>

2.配置相關文件applicationContext-jms.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans   
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context   
	http://www.springframework.org/schema/context/spring-context.xsd">
	

   
<!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供-->  
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
	//activeMQ的服務器地址
    <property name="brokerURL" value="tcp://192.168.25.132:61616"/>  
</bean>
   
<!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory -->  
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
<!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory -->  
    <property name="targetConnectionFactory" ref="targetConnectionFactory"/>  
</bean>  
	   
<!-- Spring提供的JMS工具類,它可以進行消息發送、接收等 -->  
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
    <!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory對象 -->  
    <property name="connectionFactory" ref="connectionFactory"/>  
</bean>      
<!--這個是隊列目的地,點對點的  文本信息-->  
<bean id="smsDestination" class="org.apache.activemq.command.ActiveMQQueue">  
    <constructor-arg value="sms"/>  
</bean>    

<!-- 我的監聽類的路徑 --> 
<bean id="testMessage" class="com.listen.TestMessage"></bean>
 
<!-- 消息監聽容器 --> 
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
 	<property name="connectionFactory" ref="connectionFactory" /> 
 	<property name="destination" ref="smsDestination" /> 
 	<property name="messageListener" ref="testMessage" /> 
</bean>     

</beans>

3.代碼調用

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-jms.xml")
public class jmsTest {

	@Autowired
	private  Destination  smsDestination;
	
	@Autowired
	private JmsTemplate jmsTemplate;

	@Test
	public void sendMessage() {
		
		jmsTemplate.send(smsDestination, new MessageCreator() {
			
			@Override
			public Message createMessage(Session session) throws JMSException {
				//以map的方式傳遞
				MapMessage message = session.createMapMessage();
				message.setString("phone", 123456);
				return message;
			}
		});
	}
	

}

4.創建另一個項目,加載與上面一樣的配置文件,並且創建監聽器實現類,實現由springJms提供的MessageListener

import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;

import org.springframework.beans.factory.annotation.Value;

import com.aliyuncs.exceptions.ClientException;

import utils.MessageAli;


public class TestMessage implements MessageListener{

	@Override
	public void onMessage(Message message) {
		try {
			MapMessage mapMessage =	(MapMessage) message;	
			String phone = mapMessage.getString("phone");
			System.out.println(phone);
		} catch (JMSException e) {
			e.printStackTrace();
		} catch (ClientException e) {
			e.printStackTrace();
		}
	}
}

5.創建監聽測試類,先開啓監聽測試,再開啓發送,監聽器監聽到信息後會自動將執行方法,不需要手動調用

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:applicationContext-jms.xm
l") 
public class TestQueue { 
 	@Test 
 	public void testMessage(){ 
	 try { 
   		System.in.read(); 
  	 } catch (IOException e) { 
	 	  e.printStackTrace(); 
	 }   
	 }  
} 

JMS 定義了五種不同的消息正文格式,以及調用的消息類型,允許你發送並接收以一
些不同形式的數據,提供現有消息格式的一些級別的兼容性。
· TextMessage–一個字符串對象
· MapMessage–一套名稱-值對
· ObjectMessage–一個序列化的 Java 對象
· BytesMessage–一個字節的數據流
· StreamMessage – Java 原始值的數據流

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