ActiveMQ集成到spring

spring集成activemq

1、maven引入spring-jms和activemq-client(注意版本兼容的问题)

<properties>
    <spring.version>4.3.4.RELEASE</spring.version>
    <activemq.version>5.14.0</activemq.version>
</properties>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-client</artifactId>
    <version>${activemq.version}</version>
</dependency>

小插曲:一开始我引入activemq-all,导致启动报错

java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(Ljava/lang/reflect/AnnotatedElement;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;] with root cause

这是因为跟spring-core版本冲突了,其实没必要引入activemq-all,只要activemq-cilent就够了

最终maven会下载5个jar包
spring-jms-4.3.4.RELEASE-sources.jar
activemq-client-5.14.0.jar
geronimo-jms_1.1_spec-1.1.1.jar
hawtbuf-1.11.jar
geronimo-j2ee-management_1.1._spec-1.0.1.jar

2、配置spring-avtivemq.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-4.0.xsd   
        http://www.springframework.org/schema/context   
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jms
        http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">

    <!-- ActiveMQ 连接工厂 -->
    <!-- 方式一 -->
    <!-- <amq:connectionFactory id="amqConnectionFactory"
        brokerURL="tcp://192.168.1.19:61616" userName="admin" password="admin" /> -->

    <!-- 方式二 -->
    <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://192.168.1.19:61616" />
        <property name="userName" value="admin" />
        <property name="password" value="admin" />
    </bean>

    <!-- Spring Caching连接工厂 -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
        <!-- 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="connectionFactory" />
        <!-- 非pub/sub模型(发布/订阅),即队列模式 -->
        <property name="pubSubDomain" value="false" />
    </bean>
        <bean id="queueSender" class="com.rice.mvc.avtivemq.producer.QueueSender">
        <property name="jmsTemplate" ref="jmsQueueTemplate" />
        <property name="queueName" value="rice-queue" />
    </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> -->
    <!--Spring JmsTemplate 的消息生产者 end -->

    <!-- 消息消费者 start -->
    <!-- 定义Queue监听器 -->
    <jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
        <jms:listener destination="rice-queue" ref="queueReceiver1" />
        <jms:listener destination="rice-queue" ref="queueReceiver2" />
    </jms:listener-container>

    <!-- 定义Topic监听器 -->
<!--    <jms:listener-container destination-type="topic" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
        <jms:listener destination="rice-topic" ref="topicReceiver1" />
        <jms:listener destination="rice-topic" ref="topicReceiver2" />
    </jms:listener-container> -->
    <!-- 消息消费者 end -->

</beans>  

3、编写Sender

package com.rice.mvc.avtivemq.producer;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

/**
 * @author rice
 * @date Jul 27, 2017
 * @since 1.0.0
 */
//@Component("queueSender")
public class QueueSender {
    private final static Logger logger = LoggerFactory.getLogger(QueueSender.class);

    private String queueName;

    //@Autowired
    //@Qualifier("jmsQueueTemplate")
    private JmsTemplate jmsTemplate;

    public QueueSender(String queueName, JmsTemplate jmsTemplate) {
        super();
        this.queueName = queueName;
        this.jmsTemplate = jmsTemplate;
    }

    public QueueSender() {
        super();
    }

    /**
     * 发送一条消息
     * @param message 消息内容
     */
    public void send(final String message) {
        logger.info("发送消息[{}]到队列[{}]", message, queueName);
        jmsTemplate.send(queueName, new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
    }

    public String getQueueName() {
        return queueName;
    }

    public void setQueueName(String queueName) {
        this.queueName = queueName;
    }

    public JmsTemplate getJmsTemplate() {
        return jmsTemplate;
    }

    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }
}

4、编写Receiver(分为同步接收跟异步接收2种方式,同步即主动接收,异步即监听接收),监听接收的方式:实现MessageListener,有几个监听者就实现几个类

package com.rice.mvc.avtivemq.consumer;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @author rice
 * @date Jul 27, 2017
 * @since 1.0.0
 */
@Component("queueReceiver1")
public class QueueReceiver1 implements MessageListener {
    private final static Logger logger = LoggerFactory.getLogger(QueueReceiver1.class);

    @Override
    public void onMessage(Message message) {
        try {
            String str = ((TextMessage) message).getText();
            logger.info("接收到消息[{}]", str);
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

至此,完毕

猜你喜欢

转载自blog.csdn.net/liu_dou/article/details/75579393