spring activemq 整合

创建maven项目

项目目录结构为

 

首先配置相关maven依赖

  <!-- 版本管理 -->
  <properties>
      <springframework>4.1.8.RELEASE</springframework>
  </properties>
  
  <dependencies>
    
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.10</version>
          <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        
    
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${springframework}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework}</version>
        </dependency>
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-jms</artifactId>  
            <version>${springframework}</version>  
        </dependency> 
                
        <!-- activemq -->
        <dependency>  
            <groupId>org.apache.activemq</groupId>  
            <artifactId>activemq-pool</artifactId>  
            <version>5.12.1</version>  
        </dependency>   
        <dependency>  
            <groupId>org.apache.activemq</groupId>  
            <artifactId>activemq-core</artifactId>  
            <version>5.7.0</version>
        </dependency>
    
        <!-- log4j核心包-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        
      
  </dependencies>

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  
 
  <!-- 加载spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:activemq/activemq.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    
    <!-- springmvc前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等) 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml) -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>
  
      <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    <!-- post乱码过虑器 --> 
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
      
      <context-param>   
        <param-name>log4jConfigLocation</param-name>   
        <param-value>classpath:/log4j/log4j.xml</param-value>   
    </context-param>   
    <listener>   
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>   
    </listener> 


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 activemq.xml 配置

<?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"
    xmlns:jms="http://www.springframework.org/schema/jms" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/jms
        http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd">
 
    <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->  
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
    <property name="brokerURL" value="tcp://localhost:61616"/>  
    </bean>  

    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">  
        <property name="connectionFactory" ref="targetConnectionFactory"/>  
        <property name="maxConnections" value="10"/>  
    </bean>  
    
    <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
        <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>  
    </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>
    
    <!-- 定义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 -->
    
    <bean id="queueReceiverListener" class="com.sinosoft.activemq.consumer.QueueReceiverListener"/>
    <bean id="queueReceiverListener1" class="com.sinosoft.activemq.consumer.QueueReceiverListener1"/>
    
    <!-- 定义Queue监听器 -->
    <jms:listener-container destination-type="queue"
        container-type="default" connection-factory="connectionFactory"
        acknowledge="auto">
        <jms:listener destination="queueTest" ref="queueReceiverListener" />
        <jms:listener destination="queueTest" ref="queueReceiverListener1" />
    </jms:listener-container>

    <!-- 定义Topic监听器 -->
    
    <bean id="topicReceiverListener" class="com.sinosoft.activemq.consumer.TopicReceiverListener"/> 
    <bean id="topicReceiverListener1" class="com.sinosoft.activemq.consumer.TopicReceiverListener1"/>
    <jms:listener-container destination-type="topic"
        container-type="default" connection-factory="connectionFactory"
        acknowledge="auto">
        <jms:listener destination="topicTest" ref="topicReceiverListener" />
        <jms:listener destination="topicTest" ref="topicReceiverListener1" />
    </jms:listener-container>
    
    <!-- 消息消费者 end -->
</beans>

springmvc.xml 配置

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

    <!-- 可以扫描controller、service、... 这里让扫描controller,指定controller的包 com.controlle -->
    <context:component-scan base-package="com.sinosoft">
    </context:component-scan>

    <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置 mvc:annotation-driven默认加载很多的参数绑定方法 -->
    <mvc:annotation-driven />

    <!-- 视图解析器 解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置jsp路径的前缀
        <property name="prefix" value="/jsp/"/> 
         -->
        <!-- 配置jsp路径的后缀
        <property name="suffix" value=".jsp" /> -->
    </bean>

</beans>

代码部分

QueueSenderProducer.java

作用:生产消息,发布 队列消息模式 消息

 1 @Component
 2 public class QueueSenderProducer {
 3 
 4     @Autowired
 5     @Qualifier("jmsQueueTemplate")
 6     private JmsTemplate jmsTemplate;
 7 
 8     /**
 9      * 发送消息
10      * 
11      * @param queueName
12      *            队列名称
13      * @param message
14      *            消息实体
15      * @throws Exception
16      */
17     public void send(String queueName, final String message) {
18         jmsTemplate.send(queueName, new MessageCreator() {
19 
20             public Message createMessage(Session session) throws JMSException {
21                 return session.createTextMessage(message);
22             }
23         });
24     }
25 
26 }

TopicSenderProducer.java与QueueSenderProducer.java 的代码结构相同,用于发布 发布/订阅模式 消息

 

QueueReceiverListener.java  

作用: 负责自动监听qctiveMQ中的队列消息,一旦有新消息后,将自动读取消息!

 

 1 public class QueueReceiverListener implements MessageListener {
 2  
 3      @Override
 4      public void onMessage(Message message) {  
 5          System.out.println("   -------------      接收消息       --------      ");  
 6             try {
 7                 System.out.println("队列         QueueReceiver   接收到消息:"+((TextMessage)message).getText());  
 8             } catch (JMSException e) {  
 9                 e.printStackTrace();  
10             }  
11         }  
12           
13 
14 }

QueueReceiverListener1, TopicReceiverListener,TopicReceiverListener1 与 QueueReceiverListener 的代码结构相同,作用相同,只是类名不同。

注 QueueReceiverListener,QueueReceiverListener1 用于接受消息对列模式消息,一对一,一条消息只能被消费一次

  TopicReceiverListener,TopicReceiverListener1  用于接受发布/订阅模式消息,一对多,一条消息可被多次消费

  俩者具体监听配置在activemq.xml中。

ActivemqController.java

作用:控制器

 1 @Controller
 2 @RequestMapping("mq")
 3 public class ActivemqController {
 4 
 5     @Autowired
 6     private QueueSenderProducer queueSenderProducer;
 7     @Autowired
 8     private TopicSenderProducer topicSenderProducer;
 9     
10     /**
11      * 
12      * @param message
13      * @return
14      */
15     @RequestMapping("queueSender")
16     public String queueSender(String message) {
17        18         try {
19             queueSenderProducer.send("queueTest", message);
20    21         } catch (Exception e) {
22             e.printStackTrace();
23         }
24         return "success";
25     }
26     
27     /**
28      * 
29      * @param message
30      * @return 
31      */
32     @RequestMapping("topicSender")
33     public String TopicSender(String message) {
34      35         try {
36             topicSenderProducer.send("topicTest", message);
37         38         } catch (Exception e) {
39         
40         }
41         return "success";
42     }
43 
44 }

 

测试:

队列消息模式  访问地址

后台

 

 发布订阅模式 访问地址

后台

 

 

 

posted @ 2017-02-24 14:51  叫我明羽  阅读(265)  评论(0编辑  收藏  举报