哈哈哈,开发ActiveMQ的真是厉害,嘿嘿,简单的从几个方面去介绍ActiveMQ的用处
一.ActiveMQ的应用场景:
- 用户注册,重点用户信息数据库保存,发短信、发邮件,增加业务处理复杂度,这时候使用 MQ, 将发短信、发邮箱,通知 MQ,由另外服务平台完成
- 搜索平台、缓存平台 查询数据,建立缓存、索引 ,不从数据库查询,从缓存或者索引库查询 当增加、修改、删除数据时,发送消息给 MQ,缓存平台、索引平台 从 MQ 获取 到这个信息,更新缓存或者索引
简单的说ActiveMQ主要解决的问题有: 解决服务之间耦合 ,增加系统并发处理量 大大提高程序的效率;
按照我们老师打的一个简单的比喻:
以面馆为例:没使用ActiveMQ时,客人吃面直接跟厨师说,相当于请求,当请求很多时,厨师需要做面还需要将面给对应客户;当使用ActiveMQ时,相当于我们不是厨师了,我们角色变成了传话者,只需要跟厨师说客人需要什么,而我们不用做;
也将整理的笔记贴出来吧:
1. 消息队列是什么
1. 异步: 请求的时间过长,业务花费的时间过长
2. 削峰: 请求量大,将请求的内容压入栈,一个个的处理
3. 解耦: 服务器的生产者无需关注业务的完成。只需要知道要做什么,不需要知道怎么做
2. 干什么用的
1. 响应的速度赶不上请求的速度
2. 消息的类型
1. queue: 队列。一条消息只能由一个消费者获取,没有被获取的消息,会缓存在消息队列中。
2. topic: 话题。一条消息可以由当前正在监听的所有消费者获取。消息存在时效性。没有在线的消费者,上线后无法获得消息。
3. 使用消息队列需要注意的问题
1. 消息的类型
2. 消息的名称
3. 生产: 使用哪种消息的对象TextMessage,怎么设置数据。
4. 消费:实现MessageListener,获取消息对象,根据发送的消息对象,获取消息中的内容
2.spring整合activeMQ的使用
发送消失
1. spring配置
1. 原始的activeMQ的连接,注意:如果使用amp的名称空间,启动项目需要联网。
2. 配置spring管理的连接类org.springframework.jms.connection.CachingConnectionFactory
3. 配置消息的模板对象。通过属性pubSubDomain来设置消息的类型。
<!-- 定义JmsTemplate的Queue类型 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<constructor-arg ref="connectionFactory" />
<!-- 非pub/sub模型(发布/订阅),即队列模式 -->
<property name="pubSubDomain" value="false" />
</bean>
<!-- 定义JmsTemplate的Topic类型 -->
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<constructor-arg ref="connectionFactory" />
<!-- pub/sub模型(发布/订阅) 即话题模式-->
<property name="pubSubDomain" value="true" />
</bean>
2. API
1. 注入消息的模板
//哪里需要发消息,就在哪里注入template对象
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;
2. 调用发送的APi发送消息
//send的第一个参数是字符串,表示消息的名称
jmsTemplate.send("myQueue", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("咱们发的queue消息!!");
}
});
3. 消息的使用
1. 文本消息
session.createTextMessage(text);
简单的数据,直接用文本表示。对象类型,先转成JSON字符串,再保存。
2. Map消息
复杂信息,一次传递多个信息。
```java
MapMessage message = session.createMapMessage();
message.setString(name1, value1);
message.setString(name2, value2);
```
接受消息
1. 自定义一个消息的监听器,实现MessageListener接口(不区分消息的类型,和接收的消息内容)
只需要将消息强转成发送时的类型,将消息内容取出
@Service
public class QueueConsumer1 implements MessageListener {
public void onMessage(Message message) {
//处理消息
//获取文本
TextMessage textMessage = (TextMessage) message;
textMessage.getText();
//获取mapMessage
MapMessage mapMessage = (MapMessage) message;
mapMessage.getString(name);
}
}
2. spring配置
1. 原始的activeMQ的连接,注意:如果使用amp的名称空间,启动项目需要联网。
2. 配置spring管理的连接类org.springframework.jms.connection.CachingConnectionFactory
3. 配置监听器(类型和名称)
<!-- 定义Queue监听器 -->
<jms:listener-container destination-type="queue"
container-type="default" connection-factory="connectionFactory"
acknowledge="auto">
<!-- 默认注册bean名称,应该是类名首字母小写 -->
<jms:listener destination="spring_queue2" ref="queueConsumer1" />
<jms:listener destination="spring_queue2" ref="queueConsumer2" />
</jms:listener-container>