干货|SpringBoot JMS(ActiveMQ)API实践应用详解

简介: Active是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。AC-tiveMQ使用Apache提供的...

 image.gif

image.gif

前言

Active是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。AC-tiveMQ使用Apache提供的授权,任何人都可以对其实现代码进行修改。

ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。ActiveMQ实现了JMS标准并提供了很多附加的特性。本文将带大家详细介绍ActiveMQ的API的使用。

公众号:「浅羽的IT小屋」

1. JMS的概念?

「什么是JMS呢:」

    • JMS---------JAVA    Message    Service
    • JAVA的消息服务,是sun公司提供的接口,只是一个规范,这个规范就类似于JDBC是一样的,使用的时候是需要当前规范的实现产品的。

    「JMS能干什么呢:」

      • 能够将信息发布到目的地
      • 可以从目的地来消费这个消息

      2、两种通信模型

      「队列的通信概念:」

        • 特点:当我们同一个队列有多个消费者的时候,多个消费者的数据之和才是原来队列中的所有数据
        • 队列的通信模型最大的适用场景:流量的消峰,高并发的处理

        「主题的通信模型:」

          • 特点:当我们队列有多个消费者的时候,那么这多个消费者消费到的数据是一样的
          • 主题消费者通信模型的适用场景:微服务下服务之间的异步通信

          3. MQ的实现产品

          「实现产品:」

            • ActiveMQ
            • RabbitMQ
            • RockerMQ
            • Kafka(这个设计的初衷是做分布式的日志的,后来因为日志有严格的顺序问题,这个时候人们就用Kafka来做消息队列了)

            4、JMS中常见的名词

            「常见的名词:」

              • ActiveMQConnectionFactory:这个是创建连接的工厂
              • ConnectionFactory:连接的工厂
              • Connection:连接JAVA对MQ的一个连接
              • Destination:目的地
              • 生产者(Producer)
              • 消费者(Consumer)
              • Session:会话(每一次对MQ的操作都称为一次会话)
              • Queue:队列
              • Topic:主题

              5、什么是消息队列

              「消息队列简单的说就是用来存放临时数据的地方:」

                • 生产者----------->存储介质上
                • 消费者----------->存储介质上

                「消息队列类似于快递公司:」

                  • 你可以将东西交给快递公司
                  • 目标人也可以从快递公司去取东西

                  6. ActiveMQ是什么

                  「含义:」

                    • ActiveMQ就是一个JMS的实现产品,它能够实现JMS下的所有功能

                    7、ActiveMQ能干什么

                    「主要作用:」

                      • 流量消峰处理
                      • 微服务下模块的异步通信
                      • 处理高并发下的订单
                      • 处理第三方平台的高并发
                      • 协助消息表可以完成分布式事务的最终一致性

                      8、ActiveMQ的安装

                      「ActiveMQ的安装和配置:」

                      1、官网下载Linux版的ActiveMQ(最新版本为5.13.4)
                             https://activemq.apache.org/download.html
                             2、解压安装
                            tar -zxvf apache-activemq-5.13.4-bin.tar.gz
                             3、配置(这里采用默认配置,无需修改)
                            vim /usr/lical/activemq-1/conf/activemq.xml
                             4、启动
                            cd /usr/local/activemq-1/bin
                      ./activemq start
                            5、打开管理界面(管理界面可以查看并管理所有队列及消息)
                               http://192.168.1.100:8161
                             启动成功后,可以浏览 http://localhost:8161/admin/
                             默认用户名、密码:admin/admin
                             管理界面是用jetty做容器的,如果想修改管理界面的端口,可以编辑../conf/jetty.xml,找到下面这一段:
                            <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
                          <!-- the default port       number for the web console -->
                          <property name="host" value="0.0.0.0"/>
                          <property name="port" value="8161"/>
                           </bean>
                             用户名/密码是在 ../conf/jetty-realm.properties 里,比如要增加一个管理员jimmy/123456,可参考下面修改:
                             1
                      2
                      3admin: admin, admin
                      jimmy: 123456, admin
                      user: user, user
                             注:管理界面有一个小坑,ActiveMQ 5.13.2与jdk1.8兼容性有点问题,如果使用jdk1.8,管理界面进入Queues标签页时,偶尔会报错,但是并不影响消息正常收发,只是无法从界面上查看队列情况,如果出现该问题,可将jdk版本降至1.7,同时最好清空data目录下的所有数据,再重启activemq即可。

                      image.gif

                      9. ActiveMQ的API的使用

                      「AcatveMQ的API使用:」

                        • 队列的使用(生产者)
                        package com.qy.mq.queue;
                        import org.apache.activemq.ActiveMQConnectionFactory;
                        import org.apache.activemq.Message;
                        import javax.jms.*;
                        /**
                         * @Auther: qianyu
                         * @Date: 2020/11/04 14:12
                         * @Description:生产者
                         */
                        public class Producer {
                            //准备发布的这个地址
                            private  static final String PATH="tcp://10.7.182.87:61616";
                            //ActiveMQ下的用户名
                            private static final String userName="admin";
                            //ActiveMQ下的密码
                            private static final String password="admin";
                            public static void main(String[] args) throws JMSException {
                                //第一步:创建连接的工厂
                                ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
                                //通过这个工厂获取连接
                                Connection connection = activeMQConnectionFactory.createConnection();
                                //第三步:打开这个连接
                                connection.start();
                                //第四步:创建操作MQ的这个会话
                                /**
                                 * 第一个参数:是否使用事务
                                 * 第二个参数:客户端的应答模式
                                 *     第一种:自动应答
                                 *     第二种:客户端手动应答
                                 */
                                Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                                //需要发送消息的目的地(queue操作的是队列)
                                Destination destination=session.createQueue("wqqq");
                                //生产者来生产这个消息
                                //要有生产者
                                MessageProducer messageProducer = session.createProducer(destination);
                                //发送很多的消息到消息队列中去
                        //        for (int i=0;i<100;i++){
                                    //需要准备发送的消息
                        //            TextMessage textMessage = session.createTextMessage("我是浅羽:"+i);
                                    //研究消息的类型
                                  /*  BytesMessage bytesMessage = session.createBytesMessage();
                                    bytesMessage.setByteProperty("www",new Byte("123"));
                                    //接下来就可以发送消息了
                                    messageProducer.send(bytesMessage);*/
                                //创建map类型的message
                                /*MapMessage mapMessage = session.createMapMessage();
                                mapMessage.setInt("www1",123);
                                messageProducer.send(mapMessage);*/
                                ObjectMessage objectMessage = session.createObjectMessage(new User(1, "qianyu", "123"));
                                messageProducer.send(objectMessage);
                        //        }
                            }
                        }

                        image.gif

                          • 队列的使用(消费者)
                          package com.qy.mq.queue;
                          import org.apache.activemq.ActiveMQConnectionFactory;
                          import javax.jms.*;
                          import java.io.Serializable;
                          /**
                           * @Auther: qianyu
                           * @Date: 2020/11/04 14:13
                           * @Description:消费者
                           */
                          public class Consumer {
                              //准备发布的这个地址
                              private  static final String PATH="tcp://10.7.182.87:61616";
                              //ActiveMQ下的用户名
                              private static final String userName="admin";
                              //ActiveMQ下的密码
                              private static final String password="admin";
                              public static void main(String[] args) throws JMSException {
                                  //第一步:创建连接的工厂
                                  ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
                                  //通过这个工厂获取连接
                                  Connection connection = activeMQConnectionFactory.createConnection();
                                  //第三步:打开这个连接
                                  connection.start();
                                  //第四步:创建操作MQ的这个会话
                                  /**
                                   * 第一个参数:是否使用事务
                                   * 第二个参数:客户端的应答模式
                                   *     第一种:自动应答
                                   *     第二种:客户端手动应答
                                   */
                                  Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
                                  //需要发送消息的目的地(queue操作的是队列)
                                  Destination destination=session.createQueue("wqqq");
                                  //创建我们的消费者了
                                  MessageConsumer messageConsumer = session.createConsumer(destination);
                                  //接下来就可以接收我们的消息了
                                  //Message message = messageConsumer.receive();
                                  //接收消息并指定这个超时的时间
                          //      Message message = messageConsumer.receive(5000);
                                  //接收消息没有就不等待了 直接over了  不接收了
                          //      Message message = messageConsumer.receiveNoWait();
                                  //给定当前的路径设置监听器
                                  messageConsumer.setMessageListener(new MessageListener() {
                                      @Override
                                      public void onMessage(Message message) {
                                         /* BytesMessage bytesMessage= (BytesMessage) message;
                                          try {
                                              System.out.println("获取到的数据是:"+bytesMessage.getByteProperty("www"));
                                          } catch (JMSException e) {
                                              e.printStackTrace();
                                          }*/
                                         /*MapMessage mapMessage= (MapMessage) message;
                                          try {
                                              System.out.println("获取到的数据是:"+mapMessage.getInt("www1"));
                                          } catch (JMSException e) {
                                              e.printStackTrace();
                                          }*/
                                         //测试对象类型的消息的发送和接收
                                         ObjectMessage objectMessage= (ObjectMessage) message;
                                          try {
                                              User user = (User) objectMessage.getObject();
                                              System.out.println("接收到的数据是:"+user);
                                          } catch (JMSException e) {
                                              e.printStackTrace();
                                          }
                                        /*  //我们知道是一个字符串类型的消息
                                          TextMessage textMessage= (TextMessage) message;
                                          //接下来就可以打印这个消息了
                                          try {
                                              System.out.println("消费者1---接收到的消息是:"+textMessage.getText());
                                          } catch (JMSException e) {
                                              e.printStackTrace();
                                          }*/
                                          try {
                                              //这句话就表示的是客户端来手动的进行应答
                                              message.acknowledge();
                                          } catch (JMSException e) {
                                              e.printStackTrace();
                                          }
                                      }
                                  });
                              }
                          }

                          image.gif

                            • 主题模型的生产者
                            package com.qy.mq.topic;
                            import org.apache.activemq.ActiveMQConnectionFactory;
                            import javax.jms.*;
                            /**
                             * @Auther: qianyu
                             * @Date: 2020/11/04 15:17
                             * @Description:
                             */
                            public class Producer {
                                //准备发布的这个地址
                                private  static final String PATH="tcp://10.7.182.87:61616";
                                //ActiveMQ下的用户名
                                private static final String userName="admin";
                                //ActiveMQ下的密码
                                private static final String password="admin";
                                public static void main(String[] args) throws JMSException {
                                    //第一步:创建连接的工厂
                                    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
                                    //通过这个工厂获取连接
                                    Connection connection = activeMQConnectionFactory.createConnection();
                                    //第三步:打开这个连接
                                    connection.start();
                                    //第四步:创建操作MQ的这个会话
                                    /**
                                     * 第一个参数:是否使用事务
                                     * 第二个参数:客户端的应答模式
                                     *     第一种:自动应答
                                     *     第二种:客户端手动应答
                                     */
                                    Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
                                    //需要发送消息的目的地(下面创建的就应该是主题模型的地址)
                                    Destination destination=session.createTopic("topic222");
                                    //生产者来生产这个消息
                                    //要有生产者
                                    MessageProducer messageProducer = session.createProducer(destination);
                                    //发送很多的消息到消息队列中去
                                    for (int i=0;i<100;i++){
                                        //需要准备发送的消息
                                        TextMessage textMessage = session.createTextMessage("我是浅羽:"+i);
                                        //接下来就可以发送消息了
                                        messageProducer.send(textMessage);
                                    }
                                }
                            }

                            image.gif

                              • 主题模型的消费者
                              package com.qy.mq.topic;
                              import org.apache.activemq.ActiveMQConnectionFactory;
                              import javax.jms.*;
                              /**
                               * @Auther: qianyu
                               * @Date: 2020/11/04 15:19
                               * @Description:
                               */
                              public class Consumer {
                                  //准备发布的这个地址
                                  private  static final String PATH="tcp://10.7.182.87:61616";
                                  //ActiveMQ下的用户名
                                  private static final String userName="admin";
                                  //ActiveMQ下的密码
                                  private static final String password="admin";
                                  public static void main(String[] args) throws JMSException {
                                      //第一步:创建连接的工厂
                                      ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName, password, PATH);
                                      //通过这个工厂获取连接
                                      Connection connection = activeMQConnectionFactory.createConnection();
                                      //第三步:打开这个连接
                                      connection.start();
                                      //第四步:创建操作MQ的这个会话
                                      /**
                                       * 第一个参数:是否使用事务
                                       * 第二个参数:客户端的应答模式
                                       *     第一种:自动应答
                                       *     第二种:客户端手动应答
                                       */
                                      Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
                                      //需要发送消息的目的地(queue操作的是队列)
                                      Destination destination=session.createTopic("topic222");
                                      //创建我们的消费者了
                                      MessageConsumer messageConsumer = session.createConsumer(destination);
                                      //接下来就可以接收我们的消息了
                                      //给定当前的路径设置监听器
                                      messageConsumer.setMessageListener(new MessageListener() {
                                          @Override
                                          public void onMessage(Message message) {
                                              //我们知道是一个字符串类型的消息
                                              TextMessage textMessage= (TextMessage) message;
                                              //接下来就可以打印这个消息了
                                              try {
                                                  System.out.println("消费者1---接收到的消息是:"+textMessage.getText());
                                              } catch (JMSException e) {
                                                  e.printStackTrace();
                                              }
                                              try {
                                                  message.acknowledge();
                                              } catch (JMSException e) {
                                                  e.printStackTrace();
                                              }
                                          }
                                      });
                                  }
                              }

                              image.gif

                              本篇关于ActiveMQ的介绍就先到这里结束了,后续会出更多关于ActiveMQ系列更多文章,谢谢大家支持!

                              image.gif


                              image.gif

                              点个赞,证明你还爱我

                              相关实践学习
                              消息队列RocketMQ版:基础消息收发功能体验
                              本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
                              消息队列 MNS 入门课程
                              1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
                              相关文章
                              |
                              8天前
                              |
                              JSON 搜索推荐 API
                              Lazada Item_review API接口的开发应用与收益
                              Lazada作为东南亚领先的电商平台,通过其丰富的API接口为第三方开发者提供了强大的工具。其中,Lazada商品评论列表API(item_review API)尤为重要,能够实时获取商品评论数据,帮助开发者了解用户反馈、优化商品策略、提高购物体验和建立品牌形象,从而在电商行业中实现显著的收益。本文将深入探讨该API的开发应用及其多方面的价值。
                              43 14
                              |
                              8天前
                              |
                              搜索推荐 数据挖掘 API
                              Suning商品详情API接口的开发应用与收益
                              在电商迅猛发展的时代,API接口技术成为连接不同系统的桥梁,为电商平台提供高效的数据交换能力。苏宁易购的商品详情API接口,为商家和开发者带来诸多便利和收益,包括商品信息获取、选品上架、竞品分析、个性化推荐、自动化管理和运营效率提升等方面,助力商家优化销售策略,提高用户体验,降低运营成本,增强市场竞争力,促进业务创新。
                              37 2
                              |
                              3天前
                              |
                              存储 搜索推荐 安全
                              介绍几个常用的电商API接口及其应用场景。(一篇文章全清楚)
                              电商API接口是电商平台高效运营的核心技术支撑,涵盖商品管理、订单管理、支付、客户管理、营销推广和数据分析六大模块。商品管理API实现商品信息的精准上传与动态调整;订单管理API确保订单全流程透明可控;支付API保障交易安全便捷;客户管理API通过数据分析提供个性化服务;营销推广API助力精准营销;数据分析API为决策提供数据支持。各API协同工作,推动电商行业创新发展,构建智能便捷的电商生态。
                              42 12
                              |
                              4天前
                              |
                              存储 安全 Java
                              Spring Boot 编写 API 的 10条最佳实践
                              本文总结了 10 个编写 Spring Boot API 的最佳实践,包括 RESTful API 设计原则、注解使用、依赖注入、异常处理、数据传输对象(DTO)建模、安全措施、版本控制、文档生成、测试策略以及监控和日志记录。每个实践都配有详细的编码示例和解释,帮助开发者像专业人士一样构建高质量的 API。
                              |
                              4天前
                              |
                              监控 供应链 搜索推荐
                              阿里妈妈商品详情API接口:开发、应用与收益的深度剖析
                              阿里妈妈是阿里巴巴旗下的数字营销平台,其商品详情API接口为开发者提供了获取淘宝、天猫等电商平台商品详细信息的工具。本文介绍了该接口的开发流程、应用场景及带来的收益,揭示了其在电商生态中的重要地位。
                              39 6
                              |
                              4天前
                              |
                              供应链 搜索推荐 API
                              1688APP原数据API接口的开发、应用与收益(一篇文章全明白)
                              1688作为全球知名的B2B电商平台,通过开放的原数据API接口,为开发者提供了丰富的数据资源,涵盖商品信息、交易数据、店铺信息、物流信息和用户信息等。本文将深入探讨1688 APP原数据API接口的开发、应用及其带来的商业收益,包括提升流量、优化库存管理、增强用户体验等方面。
                              30 6
                              |
                              4天前
                              |
                              机器学习/深度学习 人工智能 监控
                              API超越应用的时代,深入了解F5 API安全解决方案
                              API超越应用的时代,深入了解F5 API安全解决方案
                              18 3
                              |
                              7天前
                              |
                              供应链 搜索推荐 API
                              Walgreens商品详情API接口的开发应用与收益
                              在数字化时代,API成为连接不同系统和服务的桥梁。Walgreens通过开放其商品详情API接口,为开发者提供了丰富的数据源,支持商品搜索、个性化推荐、价格比较、库存管理等应用,创造了新的商业机会和收益模式。本文将深入探讨Walgreens商品详情API接口的开发应用及其多重收益。
                              30 5
                              |
                              6天前
                              |
                              监控 搜索推荐 API
                              京东商品详情API接口的开发、应用与收益探索
                              在数字化和互联网高速发展的时代,京东通过开放商品详情API接口,为开发者、企业和商家提供了丰富的数据源和创新空间。本文将探讨该API接口的开发背景、流程、应用场景及带来的多重收益,包括促进生态系统建设、提升数据利用效率和推动数字化转型等。
                              25 3
                              |
                              3天前
                              |
                              JSON API 数据安全/隐私保护
                              淘宝商品详情API接口系列以及应用场景
                              淘宝商品详情API接口系列是淘宝开放平台提供的一系列编程接口,允许第三方开发者通过特定的协议和方式,与淘宝平台进行数据交互。这些接口涵盖了商品搜索、商品详情获取、订单管理、物流查询、支付结算等多个方面,为开发者提供了极大的灵活性和便利性。以下是对淘宝商品详情API接口系列的详细介绍

                              热门文章

                              最新文章