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 原始值的數據流