Activemq消息队列的集成与使用

  1. mq与spring的集成
    1.1 导入pom坐标
<dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>${activemq.version}</version>
</dependency>
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>${spring.version}</version>
</dependency>

需要导入Active-mq和spring-jms两个

2.2.配置applicatonContext-mq.xml文件,并在applicationContext.xml中引入该文件

<import resource="applicationContext-mq.xml"/>

在applicatonContext-mq.xml,需配置mq的连接和连接工厂,如果是生产者,需定义生产者的模板,具体设置如下:

<bean id="amqConnectionFaction" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"></property>
        <property name="userName" value="admin"></property>
        <property name="password" value="admin"></property>
    </bean>
    <!-- Spring Caching连接工厂 -->
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="mqconnectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="amqConnectionFaction"></property>
        <!-- 同上,同理 -->
        <!-- <constructor-arg ref="amqConnectionFactory" /> -->
        <!-- Session缓存数量 -->
        <property name="sessionCacheSize" value="100" />
    </bean>
    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
        <constructor-arg ref="mqconnectionFactory" />
        <!-- 非pub/sub模型(发布/订阅),即队列模式 -->
        <property name="pubSubDomain" value="false" />
    </bean>

对于消费者中applicationContext.xml文件中除了要定义连接和连接工厂,还要设置监听,具体配置如下:

<!-- 扫描 @Server @Controller @Repository -->
    <context:component-scan base-package="包名"/>
<bean id="amqConnectionFaction" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"></property>
        <property name="userName" value="admin"></property>
        <property name="password" value="admin"></property>
    </bean>
    <!-- Spring Caching连接工厂 -->
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="mqconnectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="amqConnectionFaction"></property>
        <!-- 同上,同理 -->
        <!-- <constructor-arg ref="amqConnectionFactory" /> -->
        <!-- Session缓存数量 -->
        <property name="sessionCacheSize" value="100" />
    </bean>
    <jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
    <!--bos_sms为生产者中发送的消息名 sms为mq消费者SmsConsumer中的@Service("smsConsumer")-->
    <jms:listener destination="bos_sms" ref="smsConsumer"/> 
    </jms:listener-container>

2框架的使用

  1. 在生产者中,Service中注入jmsTemplate
@Autowired
    @Qualifier("jmsQueueTemplate")
    private JmsTemplate jmsTemplate;

然后程序可以调用jmsTemplate的send方法

jmsTemplate.send("bos_sms", new MessageCreator() {

            @Override
            public Message createMessage(Session session) throws JMSException {
                MapMessage mapMessage = session.createMapMessage();
                mapMessage.setString("telephone", model.getTelephone());
                mapMessage.setString("code", code);

                return mapMessage;
            }
        });

对于消费者一是配置好applicationContext.xml文件,新建一个Consumer类实现MessageListener,类名需加注解@Service(“smsConsumer”)

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

import org.springframework.stereotype.Service;
@Service("smsConsumer")
public class SmsConsumer implements MessageListener {

    @Override
    public void onMessage(Message message) {
        MapMessage mapMessage=(MapMessage) message;

        try {
            String telephone = mapMessage.getString("telephone");
            String code=mapMessage.getString("code");
//          SendSmsResponse smsResponse = SmsUtil.sendSmsmsg(telephone, code);
//          if("OK".equals(smsResponse.getCode())){
            System.out.println("短信发送成功!");
//          }else{
//              System.out.println("短信发送失败");
//          }


        } catch (Exception e) {

            e.printStackTrace();
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值