干货|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版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
                              消息队列 MNS 入门课程
                              1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
                              相关文章
                              |
                              3月前
                              |
                              供应链 搜索推荐 数据挖掘
                              探秘京东 API 接口的神奇应用场景
                              京东API如同数字钥匙,助力商家实现商品、库存、订单等多平台高效同步,提升效率超80%。支持物流实时追踪,增强用户满意度;赋能精准营销与数据分析,决策准确率提升20%以上,全面优化电商运营。
                              144 1
                              |
                              4月前
                              |
                              人工智能 自然语言处理 机器人
                              使用 API 编程开发扣子应用
                              扣子(Coze)应用支持通过 API 编程,将 AI 聊天、内容生成、工作流自动化等功能集成至自有系统。主要 API 包括 Bot API(用于消息交互与会话管理)及插件与知识库 API(扩展功能与数据管理)。开发流程包括创建应用、获取密钥、调用 API 并处理响应,支持 Python 等语言。建议加强错误处理、密钥安全与会话管理,提升集成灵活性与应用扩展性。
                              1352 0
                              |
                              5月前
                              |
                              监控 供应链 搜索推荐
                              电商数据开发实践:深度剖析1688商品详情 API 的技术与应用
                              在电商数字化转型中,数据获取效率与准确性至关重要。本文介绍了一款高效商品详情API,具备全维度数据采集、价格库存管理、多媒体资源获取等功能,结合实际案例探讨其在电商开发中的应用价值与优势。
                              |
                              3月前
                              |
                              Ubuntu API C++
                              C++标准库、Windows API及Ubuntu API的综合应用
                              总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
                              166 11
                              |
                              4月前
                              |
                              人工智能 Java 机器人
                              基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
                              Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
                              3518 2
                              基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
                              |
                              4月前
                              |
                              供应链 安全 API
                              唯品会:利用银行转账API实现企业采购对公支付的技术实践
                              企业采购支付面临合规、效率与对账难题。唯品会通过银行API实现银企直连,构建安全高效对公支付系统,支持ISO 20022标准与多重风控,支付耗时从72小时降至90秒,错误率下降98%,推动供应链数字化升级。(236字)
                              416 1
                              |
                              4月前
                              |
                              人工智能 数据可视化 测试技术
                              AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
                              AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
                              568 11
                              |
                              4月前
                              |
                              算法 API 数据安全/隐私保护
                              深度解析京东图片搜索API:从图像识别到商品匹配的算法实践
                              京东图片搜索API基于图像识别技术,支持通过上传图片或图片URL搜索相似商品,提供智能匹配、结果筛选、分页查询等功能。适用于比价、竞品分析、推荐系统等场景。支持Python等开发语言,提供详细请求示例与文档。
                              |
                              4月前
                              |
                              安全 API 数据安全/隐私保护
                              【Azure 环境】Microsoft Graph API实现对Entra ID中应用生成密码的时间天数
                              本文介绍如何通过 Azure 的 App Management Policy 限制用户在创建 AAD 应用程序的 Client Secret 时设置最长 90 天的有效期。通过 Microsoft Graph API 配置 defaultAppManagementPolicy,可有效控制密码凭据的生命周期,增强安全管理。
                              149 4
                              |
                              4月前
                              |
                              Java API 开发者
                              揭秘淘宝详情 API 接口:解锁电商数据应用新玩法
                              淘宝详情API是获取商品信息的“金钥匙”,可实时抓取标题、价格、库存等数据,广泛应用于电商分析、比价网站与智能选品。合法调用,助力精准营销与决策,推动电商高效发展。(238字)
                              166 0

                              热门文章

                              最新文章