zoukankan      html  css  js  c++  java
  • SpringBoot使用JMS(activeMQ)的两种方式 队列消息、订阅/发布

    刚好最近同事问我activemq的问题刚接触所以分不清,前段时间刚好项目中有用到,所以稍微整理了一下,仅用于使用

    1.下载ActiveMQ 

    地址:http://activemq.apache.org/download.html

    2.启动ActiceMQ

    windows版本直接双击启动bin/win64/activemq.bat

    linux版本也是下载解压在bin/linux-x86-64或者linux-x86-32下 

    cd apache-activemq-5.14.1/bin/linux-x86-64/
    

      

    ./activemq start

    启动完成之后,浏览器输入:http://localhost:8161/admin 会显示如下界面就证明成功了

    浏览器输入:http://localhost:8161/admin/queues.jsp 需要输入账户密码默认:admin/admin

    则会显示消息队列主题等信息

    3.Springboot配置ActiveMQ

    加入activemq 依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-activemq</artifactId>
    </dependency>

    配置连接属性:

     如果是properties后缀文件

    spring.activemq.broker-url=tcp://localhost:61616
    spring.activemq.user=admin
    spring.activemq.password=admin
    spring.activemq.pool.enabled=false

    如果是yml后缀文件

    spring:
      profiles : dev
      application:
        name: user-service
      activemq:
        broker-url: tcp://localhost:61616
        user: admin
        password: admin
        in-memory: true
        pool:
          enabled: true
          max-connections: 500

    4.消息队列的使用

     生产者、消费者模式

    创建生产者

    package org.tfkf.minsurance.jms.activemq;
    
    import javax.jms.Destination;
    
    import org.apache.activemq.command.ActiveMQQueue;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsMessagingTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     *
     * @Author zyt
     * @Date 2018/3/15 17:39
     */
    @Component
    public class Producer {
    
        @Autowired
        private JmsMessagingTemplate jmsMessagingTemplate;
    
        /**
         * 消息发送
         * @param destinationName
         * @param message
         * @return
         */
        public boolean sendMessage(final String message,String destinationName) {
            boolean result = true;
            try {
                Destination destination = new ActiveMQQueue(destinationName);
                jmsMessagingTemplate.convertAndSend(destination, message);
            } catch (Exception e) {
                e.printStackTrace();
                result = false;
            }
            return result;
        }
    }

    创建消费者,@JmsListener注解,在java7及以下版本jdk中,可以使用@JmsListeners代替它。

        @JmsListener(destination = "name.msg")
        public void receive(String message){
            System.out.println("name.msg消费者:"+message);
        }

    我们封装一个调用例子

     

    调用实例

     返回结果

    5.发布/订阅模式

    先发布一个话题

    package org.tfkf.minsurance.jms.activemq;
    
    import javax.jms.Destination;
    
    import org.apache.activemq.command.ActiveMQTopic;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsMessagingTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     *
     * @Author zyt
     * @Date 2018/3/15 17:40
     */
    @Component
    public class Producer {
    
        @Autowired
        private JmsMessagingTemplate jmsMessagingTemplate;
    
        /**
         * 发布者 发布topic
         * @param destinationName
         * @param message
         * @return
         */
        public boolean publish(String destinationName, final String message) {
            boolean result = true;
            try {
                Destination destination = new ActiveMQTopic(destinationName);
                jmsMessagingTemplate.convertAndSend(destination, message);
            } catch (Exception e) {
                e.printStackTrace();
                result = false;
            }
            return result;
        }
    }

     订阅者

    package org.tfkf.minsurance.jms.activemq;
    
    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Component;
    
    /**
     *
     * @Author zyt
     * @Date 2018/3/15 17:41
     */
    @Component
    public class Consumer {
    
        @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory")
        public void subscribe(String message){
            System.out.println("login.topic订阅者一:"+message);
        }
    
        @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory")
        public void subscribe1(String message){
            System.out.println("login.topic订阅者二:"+message);
        }
    }

    在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置

    package org.tfkf.minsurance.user.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
    import javax.jms.ConnectionFactory; @Configurationpublic class ConfigBase{ /** * 在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置 * @param connectionFactory * @return */ @Bean public JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(true); return factory; } }

    封装调用

    调用实例

    返回结果

    两种模式实践就ok了

  • 相关阅读:
    学习Jammendo代码的心路历程(二)ViewFlipper数据的填充
    学习Jammendo代码的心路历程(一)简单的淡出效果实现
    面向对象的一小步:添加ActiveRecord的Scope功能
    关于token和refresh token
    一个极为简单的方法实现本地(离线)yum安装rpm包
    Yii2基本概念之——生命周期(LifeCycle)
    一篇文章说透Nginx的rewrite模块
    PHP Session 常用的函数
    Session 的原理及最佳实践
    Yii2基本概念之——配置(Configurations)
  • 原文地址:https://www.cnblogs.com/zhouyantong/p/9400158.html
Copyright © 2011-2022 走看看