干货|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
                              相关文章
                              |
                              1天前
                              |
                              人工智能 运维 监控
                              发现API安全风险,F5随时随地保障应用和API安全
                              发现API安全风险,F5随时随地保障应用和API安全
                              17 7
                              |
                              4天前
                              |
                              人工智能 监控 安全
                              自学记录鸿蒙 API 13:骨骼点检测应用Core Vision Skeleton Detection
                              骨骼点检测技术能够从图片中识别出人体的关键骨骼点位置,如头部、肩部、手肘等,广泛应用于运动健身指导、游戏交互、医疗辅助、安全监控等领域。我决定深入学习HarmonyOS Next API 13中的Skeleton Detection API,并开发一个简单的骨骼点检测应用。通过理解API核心功能、项目初始化与配置、实现检测功能、构建用户界面,以及性能优化和功能扩展,逐步实现这一技术的应用。未来计划将其应用于健身指导和智能监控领域,探索与其他AI能力的结合,开发更智能的解决方案。如果你也对骨骼点检测感兴趣,不妨一起进步!
                              129 9
                              |
                              7天前
                              |
                              存储 API 计算机视觉
                              自学记录HarmonyOS Next Image API 13:图像处理与传输的开发实践
                              在完成数字版权管理(DRM)项目后,我决定挑战HarmonyOS Next的图像处理功能,学习Image API和SendableImage API。这两个API支持图像加载、编辑、存储及跨设备发送共享。我计划开发一个简单的图像编辑与发送工具,实现图像裁剪、缩放及跨设备共享功能。通过研究,我深刻体会到HarmonyOS的强大设计,未来这些功能可应用于照片编辑、媒体共享等场景。如果你对图像处理感兴趣,不妨一起探索更多高级特性,共同进步。
                              62 11
                              |
                              2天前
                              |
                              人工智能 数据可视化 API
                              自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
                              本文介绍了使用HarmonyOS的Calendar Kit开发日程管理应用的过程。通过API 13版本,不仅实现了创建、查询、更新和删除日程等基础功能,还深入探索了权限请求、日历配置、事件添加及查询筛选等功能。实战项目中,开发了一个智能日程管理工具,具备可视化管理、模糊查询和智能提醒等特性。最终,作者总结了模块化开发的优势,并展望了未来加入语音助手和AI推荐功能的计划。
                              110 1
                              |
                              4天前
                              |
                              JSON API 开发者
                              Lazada 商品评论列表 API 接口:开发、应用与收益
                              Lazada作为东南亚领先的电商平台,其商品评论数据蕴含丰富信息。通过开发和利用Lazada商品评论列表API接口,企业可深入挖掘这些数据,优化产品、营销和服务,提升客户体验和市场竞争力。该API基于HTTP协议,支持GET、POST等方法,开发者需注册获取API密钥,并选择合适的编程语言(如Python)进行开发。应用场景包括竞品分析、客户反馈处理及精准营销,帮助企业提升销售业绩、降低运营成本并增强品牌声誉。
                              19 2
                              |
                              14天前
                              |
                              存储 搜索推荐 安全
                              介绍几个常用的电商API接口及其应用场景。(一篇文章全清楚)
                              电商API接口是电商平台高效运营的核心技术支撑,涵盖商品管理、订单管理、支付、客户管理、营销推广和数据分析六大模块。商品管理API实现商品信息的精准上传与动态调整;订单管理API确保订单全流程透明可控;支付API保障交易安全便捷;客户管理API通过数据分析提供个性化服务;营销推广API助力精准营销;数据分析API为决策提供数据支持。各API协同工作,推动电商行业创新发展,构建智能便捷的电商生态。
                              109 12
                              |
                              7天前
                              |
                              供应链 搜索推荐 API
                              1688榜单商品详细信息API接口的开发、应用与收益
                              1688作为全球知名的B2B电商平台,为企业提供丰富的商品信息和交易机会。为满足企业对数据的需求,1688开发了榜单商品详细信息API接口,帮助企业批量获取商品详情,应用于信息采集、校验、同步与数据分析等领域,提升运营效率、优化库存管理、精准推荐、制定市场策略、降低采购成本并提高客户满意度。该接口通过HTTP请求调用,支持多种应用场景,助力企业在电商领域实现可持续发展。
                              46 4
                              |
                              6天前
                              |
                              监控 搜索推荐 API
                              京东按图搜索京东商品(拍立淘)API接口的开发、应用与收益
                              京东通过开放商品详情API接口,尤其是按图搜索(拍立淘)API,为开发者、企业和商家提供了创新空间和数据支持。该API基于图像识别技术,允许用户上传图片搜索相似商品,提升购物体验和平台竞争力。开发流程包括注册账号、获取密钥、准备图片、调用API并解析结果。应用场景涵盖电商平台优化、竞品分析、个性化推荐等,为企业带来显著收益,如增加销售额、提高利润空间和优化用户体验。未来,随着数字化转型的深入,该API的应用前景将更加广阔。
                              45 1
                              |
                              7天前
                              |
                              安全 API 数据安全/隐私保护
                              速卖通AliExpress商品详情API接口深度解析与实战应用
                              速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
                              |
                              10天前
                              |
                              存储 搜索推荐 API
                              小红书笔记详情API接口的开发、应用与收益
                              小红书笔记详情API接口为开发者、企业和内容创作者提供了获取平台丰富资源的通道。通过该接口,用户可以提取笔记的详细信息(如标题、正文、标签等),并应用于市场调研、竞品分析、内容创作、电商推荐等多个领域。这不仅有助于提升品牌影响力和优化用户体验,还能挖掘商业机会,促进内容创新,增强用户互动与社群凝聚力。总之,小红书笔记详情API接口为企业和个人在社交媒体领域探索新增长点提供了重要工具。
                              70 0