1. JMS 和activeMQ 关系
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
2. 使用场景
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,从而节省请求响应时间并能对程序间进行解耦。
3. ActiveMQ下载与安装
(1) 官方网站下载:http://activemq.apache.org/
(2) 安装(Linux)解压此文件 tar zxvf apache-activemq-5.12.0-bin.tar.gz
(3) 启动./activemq start
(4) 假设服务器地址为192.168.25.135 ,打开浏览器输入地址 http://192.168.25.135:8161/ 即可进入ActiveMQ管理页面
4. JMS消息传递类型
一种是点对点的,即一个生产者和一个消费者一一对应
另一种是发布/ 订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
5. JMS消息数据类型
· TextMessage--一个字符串对象
· MapMessage--一套名称-值对
· ObjectMessage--一个序列化的 Java 对象
· BytesMessage--一个字节的数据流
· StreamMessage -- Java 原始值的数据流
6. Spring整合JMS
6.1点对点模式
6.1.1消息生产者
创建maven工程,添加SpringJms 、activeMQ依赖
[XML] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
|
< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-jms</ artifactId >
</ dependency >
< dependency >
< groupId >org.apache.activemq</ groupId >
< artifactId >activemq-client</ artifactId >
< version >5.13.4</ version >
</ dependency >
|
创建spring配置文件
[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
< bean id = "targetConnectionFactory" class = "org.apache.activemq.ActiveMQConnectionFactory" >
< property name = "brokerURL" value = "tcp://192.168.25.135: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 >
|
6.1.2 消息生产者自定义类发送消息
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
@Component
public class QueueProducer {
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
private Destination queueTextDestination;
/**
* 发送文本消息
* @param text
*/
public void sendTextMessage( final String text){
jmsTemplate.send(queueTextDestination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(text);
}
});
}
}
|
6.1.3消息消费者
创建maven工程,添加SpringJms 、activeMQ依赖(同上)
创建spring配置文件
[XML] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
< bean id = "targetConnectionFactory" class = "org.apache.activemq.ActiveMQConnectionFactory" >
< property name = "brokerURL" value = "tcp://192.168.25.135:61616" />
</ bean >
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
< bean id = "connectionFactory" class = "org.springframework.jms.connection.SingleConnectionFactory" >
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
< property name = "targetConnectionFactory" ref = "targetConnectionFactory" />
</ bean >
<!--这个是队列目的地,点对点的 文本信息-->
< bean id = "queueTextDestination" class = "org.apache.activemq.command.ActiveMQQueue" >
< constructor-arg value = "sms" />
</ bean >
<!-- 我的监听类 -->
< bean id = "myMessageListener" class = "cn.itcast.demo.MyMessageListener" ></ bean >
<!-- 消息监听容器 -->
< bean class = "org.springframework.jms.listener.DefaultMessageListenerContainer" >
< property name = "connectionFactory" ref = "connectionFactory" />
< property name = "destination" ref = "queueTextDestination" />
< property name = "messageListener" ref = "myMessageListener" />
</ bean >
|
6.1.3 消息消费方自定义监听类
[Java] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
|
public class MyMessageListener implements MessageListener {
public void onMessage(Message message) {
TextMessage textMessage=(TextMessage)message;
try {
System.out.println( "接收到消息:" +textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
|