ActiveMQ 消息队列使用

ActiveMQ 消息队列

1. ActiveMQ的作用分析: 防止拥堵, 解决大批量并发访问的问题.
    举例:用户注册 ---> 调用SmsUtils发送短信, 如果考虑到调用很多次,并发可能很大的时候这个时候就运用mq;
    解决:用户注册 --> ActiveMQ消息队列平台 --> Sms短信平台 --> 调用SmsUtils发送短信.
    1) 解决服务之间耦合;
    2) 使用消息队列, 增加系统并发处理量;

2. 应用场景分析
    1) 用户注册, 发送短信, 发送邮件通知到MQ, 利用其他的服务平台完成发送;
    2) 搜索平台, 缓存平台. 减少数据库的访问量, 当进行增删改的时候, 直接发送消息给MQ, 从缓存平台进行处理

3. ActiveMQ使用的是标准的生产者和消费者模型.
有两种数据结构:
    1) Queue队列: 生产一个消息, 只能由一个消费者消费;
    2) Topic话题: 生产者生产了一个消息, 可以由多个消费者进行消费;
案例分析:
//1. 第一步, 导入Maven坐标
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.14.0</version>
</dependency>
//2. 生产者代码编写: 默认tcp连接MQ的端口号是 61616;
<!--3. Spring整合activeMQ, 无需改变-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:amq="http://activemq.apache.org/schema/core"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">
    <!-- ActiveMQ 连接工厂 -->
    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
    <!-- 如果连接网络:tcp://ip:61616;未连接网络:tcp://localhost:61616 以及用户名,密码-->
    <amq:connectionFactory id="amqConnectionFactory"
        brokerURL="tcp://localhost:61616" userName="admin" password="admin" />
    <!-- Spring Caching连接工厂 -->
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
    <bean id="mqConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
        <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
        <!-- 同上,同理 -->
        <!-- <constructor-arg ref="amqConnectionFactory" /> -->
        <!-- Session缓存数量 -->
        <property name="sessionCacheSize" value="100" />
    </bean>
    <!-- Spring JmsTemplate 的消息生产者 start-->
    <!-- 定义JmsTemplate的Queue类型 -->
    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 --> 
        <constructor-arg ref="mqConnectionFactory" />
        <!-- 非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="mqConnectionFactory" />
        <!-- pub/sub模型(发布/订阅) -->
        <property name="pubSubDomain" value="true" />
    </bean>
    <!--Spring JmsTemplate 的消息生产者 end-->
</beans>
//4. 注入发短信的模板
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;
//5. 发送短信
@Action(value="sendMsg")
public void sendMsg(){
    //3. 使用MQ服务,发送一条信息
    jmsTemplate.send("bos_sms", new MessageCreator() {
        @Override
        public Message createMessage(Session session) throws JMSException {
            MapMessage message = session.createMapMessage();
            message.setString("telephone", workBill.getOrder().getTelephone());
            message.setString("msg", "你好!");
             return message;
        }
    });
}

猜你喜欢

转载自blog.csdn.net/Orangesss_/article/details/82178785