• activeMQ Spring 整合


     队列 主题 生产值 消费者 小案例

    本人用的是自己公司项目  maven项目 首先配置pom.xml文件

    这个是spring中加的代码 应该还需要context..等  这些就不多说了  用过spring的  还有springmvc的 应该只到还要什么吧  就不一一说了  

    <!-- 配置activemq --> <spring.version>4.1.3.RELEASE</spring.version> 
                <dependency>
                    <groupId>org.springframework</groupId>  
                    <artifactId>spring-jms</artifactId> 
                    <version>${spring.version}</version>
                </dependency>
                
                <dependency>
                    <groupId>org.apache.xbean</groupId>
                    <artifactId>xbean-spring</artifactId>
                    <version>3.18</version>
                </dependency>

    还有activemq的配置  

    <!-- activemq -->
                <!-- 配置activemq -->
                <dependency>  
                    <groupId>org.apache.activemq</groupId>  
                    <artifactId>activemq-core</artifactId>  
                    <version>5.7.0</version>
                </dependency> 
                <dependency>  
                    <groupId>org.apache.activemq</groupId>  
                    <artifactId>activemq-pool</artifactId>  
                    <version>5.12.1</version>  
                </dependency> 

    到了这一步 应该是就没有 什么配置了

    队列与主题我分两步粘代码 

    接下来 我先说 队列的xml的配置

    <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"
            >
        
        <!-- <context:component-scan base-package="com.gzframe.demo.activemq" />
        <mvc:annotation-driven /> -->
            
        <amq:connectionFactory id="amqConnectionFactory" 
            brokerURL="tcp://**.**.**.***:61616" 
            userName="admin" 
            password="admin" />
        
        <!-- 配置JMS连接工长 -->
        <bean id="connectionFactoryMq"
            class="org.springframework.jms.connection.CachingConnectionFactory">
            <constructor-arg ref="amqConnectionFactory" />
            <property name="sessionCacheSize" value="100" />
        </bean>
        <!-- 定义队 -->
        <!-- 定义消息队列(Queue) -->
        <bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
            <!-- 设置消息队列的名字 -->
            <constructor-arg>
                <value>topic.topic.demo2</value>
            </constructor-arg>
        </bean>
        <!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
        <bean id="jmsTemplateQueue" class="org.springframework.jms.core.JmsTemplate">
            <property name="connectionFactory" ref="connectionFactoryMq" />
            <property name="defaultDestination" ref="demoQueueDestination" />
            <property name="receiveTimeout" value="10000" />
            <!-- true是topic,false是queue,默认是false,此处显示写出false -->
            <property name="pubSubDomain" value="false" />
        </bean>
     </beans>

    首先我先说 不用监听器的   手动实现生产者消费者

    我的controller层

    @Controller
    public class ActiveMqController {
    
        @Autowired
        private ActiveMqService activeMqService;//我的service
        /**
         * 
        * @Title: activeTest 
        * @Description: 生产者 队列
        * @param @return    设定文件 
        * @return String    返回类型 
        * @throws
         */
        @RequestMapping("activeTest")
        @ResponseBody
        public String activeTest() {
            activeMqService.activeTest();
            return null;
    
        }
    
        
    }

    我的实现层 中间有个接口service  我就不多说了

    @Service
    public class ActiveMqServiceImpl implements ActiveMqService{
        
        @Resource(name="jmsTemplateQueue")
        private JmsTemplate jmsTemplateQueue;//xml注入过jms的东西  
        //队列名gzframe.demo
        @Resource(name="demoQueueDestination")
        private Destination destination;//mq生成的名字
        
        
        /**
         * 实现生产者
         */
        public void activeTest() {
             System.out.println("向队列" + destination.toString() + "发送了消息------------" + " +++++名字 bug2");
             jmsTemplateQueue.send(destination, new MessageCreator() {
                public Message createMessage(Session session) throws JMSException {
                  return session.createTextMessage("+++++名字 bug2");
                }
              });
        }
    }

    实现结果

     

     

    现在我开始说 消费者

    /**
         * 接收消息
         */
        @RequestMapping("receive")
        @ResponseBody
        public String receive() {
            String str = activeMqService.receive();
            System.out.println("成功的取出来了+:" + str);
            return null;
    
        }

    这个方法  是在一个controller里 所以我就不复制类了  实现也是哦!!!

     我的实现

     /**
         * 接收消息
         */
        public String receive() {
            TextMessage tm = (TextMessage) jmsTemplateQueue.receive(destination);
            String str = null;
            try {
                System.out.println("从队列" + destination.toString() + "收到了消息:	"
                        + tm.getText());
                str = tm.getText();
            } catch (JMSException e) {
                e.printStackTrace();
            }
            return str;
        }

    实现结果

     

    我现在 开始监听实现  也就是说 只要我我生产了 东西  直接就会用掉   如果实现监听 我们必须要实现一个接口MessageListener

     首先配置 xml  我就直接监听的xml了  有人用的话 自行在家 之前的xml里

    <!-- 显示注入消息监听容器(Queue),配置连接工厂,监听的目标是demoQueueDestination,监听器是上面定义的监听器 -->
        <bean id="queueListenerContainer"
            class="org.springframework.jms.listener.DefaultMessageListenerContainer">
            <property name="connectionFactory" ref="connectionFactoryMq" />   //配置工厂
            <property name="destination" ref="demoQueueDestination" />        //监听那个名字
            <property name="messageListener" ref="activeMqServiceImpl" />     //实现监听接口的类
        </bean>
    @Service
    public class ActiveMqServiceImpl implements ActiveMqService,MessageListener{
        
        @Resource(name="jmsTemplateQueue")
        private JmsTemplate jmsTemplateQueue;//xml注入过jms的东西  
        //队列名gzframe.demo
        @Resource(name="demoQueueDestination")
        private Destination destination;//mq生成的名字
    
        @Override
        public void onMessage(Message message) {
            // TODO Auto-generated method stub
            TextMessage tm = (TextMessage) message;
            try {
                System.out.println("ActiveMqServiceImpl监听到了文本消息:	"
                        + tm.getText());
                //do something ...
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
        
        
    }

    这回我只要运行 生产者 就会直接消费了

    这个是队列一对一的形式  也有监听  我会在下一篇文章 把我的 主题  订阅模式粘出来   这里的代码比较多了  所以决定放到下一篇文章 哈哈哈

  • 相关阅读:
    OI回忆录
    【CSP2019】题解合集
    微电影《Junior·BQB》——剧本
    【UOJ139】【UER #4】被删除的黑白树
    NOIWC2019 冬眠记
    THUWC2019 划水记
    【XSY3413】Lambda
    【BZOJ3065】带插入区间k小值
    【BZOJ3600】没有人的算术
    【BZOJ4864】【BJWC2017】神秘物质
  • 原文地址:https://www.cnblogs.com/pqy521/p/8145053.html
Copyright © 2020-2023  润新知