当前位置: 首页 > article >正文

性能工具之 JMeter ActiveMQ 脚本开发实践

文章目录

  • 一、ActiveMQ环境搭建
    • 1.1、控制台环境搭建
    • 1.2、控制台配置
  • 二、SpringBoot开发环境搭建
  • 三、JMeter脚本二次开发环境搭建

一、ActiveMQ环境搭建

1.1、控制台环境搭建

下载 ActiveMQ 地址为:
https://activemq.apache.org/components/classic/download/

在这里插入图片描述
注意:

拷贝apache-activemq-6.12-bin.tar.gz到Linux服务器的/opt下
解压缩 tar -zxf apache-activemq-6.12-bin.tar.gz
重命名 mv apache-activemq-6.12 activemq

进入目录后显示:

[root@lw activemq]# ll
总用量 11148
-rwxr-xr-x. 1 root root 11354996 412 01:35 activemq-all-6.1.2.jar
drwxr-xr-x. 4 root root      130 716 14:28 bin
drwxr-xr-x. 2 root root     4096 716 14:28 conf
drwxr-xr-x. 2 root root       26 716 14:28 data
drwxr-xr-x. 2 root root       76 716 14:28 docs
drwxr-xr-x. 7 root root       71 412 01:35 examples
drwxr-xr-x. 6 root root     4096 716 14:29 lib
-rw-r--r--. 1 root root    40581 412 01:35 LICENSE
-rw-r--r--. 1 root root     3334 412 01:35 NOTICE
-rw-r--r--. 1 root root     2611 412 01:35 README.txt
drwxr-xr-x. 6 root root       95 716 14:28 webapps
drwxr-xr-x. 3 root root       18 716 14:28 webapps-demo

配置JDK路径:

[root@lw activemq]#  vim /opt/activemq/bin/activemq
# 添加java_home/java_cmd环境配置如:

在这里插入图片描述

启动服务命令 service activemq start

[root@lw ~]# service activemq start 
INFO: Loading '/opt/activemq//bin/setenv'
INFO: Using java '/usr/local/jdk-17.0.11/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties and log4j2.properties to get details
INFO: pidfile created : '/opt/activemq//data/activemq.pid' (pid '117820')
[root@lw ~]#

打开浏览器验证是否可以打开ActiveMQ控制台:
在这里插入图片描述

1.2、控制台配置

修改配置文件 /opt/activemq/conf/jetty.xml

修发现8161对应的ip地址是127.0.0.1,这个地址一般都是localhost的地址,所以需要把这个地址改成0.0.0.0,即广播地址。

<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>

    <bean id="Server" depends-on="jettyPort" class="org.eclipse.jetty.server.Server"
        destroy-method="stop">

        <property name="handler">
            <bean id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
                <property name="handlers">
                    <list>
                        <ref bean="contexts" />
                        <ref bean="securityHandler" />
                    </list>
                </property>
            </bean>
        </property>

重新启动,打开浏览器地址:
在这里插入图片描述

二、SpringBoot开发环境搭建

新建 maven下项目并且在 pom 文件中输入:

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-pool -->
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-pool</artifactId>
        <version>${activemq.version}</version>
    </dependency>
</dependencies>

上面步骤完成后,就可以新建一个成产者进行测试是否可以用队列生产者搭建,代码参考如下:

 public static void main(String[] args) throws JMSException {
        String brokerURL = "tcp://192.168.24.137:61616";
        //构造连接工厂实例对象
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
        //构造从工厂得到连接对象
        Connection connection = connectionFactory.createConnection();
        //启动
        connection.start();
        //获取操作连接
        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        //获取session,注意指定消息队列
        Queue queue = session.createQueue("7dGroup-test");
        //消息的目的地,消息发给谁
        MessageProducer producer = session.createProducer(queue);
        //消息发送者
        //构造消息,此处写死,项目就是参数,或者方法获取
        TextMessage message = session.createTextMessage("我是测试者");
        producer.send(message);
        producer.close();
        session.close();
        connection.close();
    }

打开网址点击 Queues :
在这里插入图片描述

执行代码提示成功:
在这里插入图片描述
控制台显示:
在这里插入图片描述
点击 Topics 显示如下:
在这里插入图片描述

如果修改 Topics 发送消息,代码修改一个地方即可,如下图:
在这里插入图片描述
参考代码如下:

  Topic topic = session.createTopic("7dGroup-yace");
        //消息的目的地,消息发给谁
        MessageProducer producer = session.createProducer(topic);
        //消息发送者
        //构造消息,此处写死,项目就是参数,或者方法获取
        TextMessage message = session.createTextMessage("我是测试者");

执行代码查看控制台:
在这里插入图片描述
在查看 Queues没有增加数据:

在这里插入图片描述
消费者搭建,参考代码:


 String brokerURL = "tcp://192.168.24.137:61616";
        //构造连接工厂实例对象
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
        //构造从工厂得到连接对象
        Connection connection = connectionFactory.createConnection();
        //启动
        connection.start();
        //获取操作连接
        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        //获取session,注意指定消息队列
        Queue queue = session.createQueue("7dGroup-test");
        // 创建消费者
        MessageConsumer consumer = session.createConsumer(queue);
        while (true) {
            TextMessage message = (TextMessage) consumer.receive();
            if (null != message) {
                System.out.println("我收到一条消息" + message.getText());
            } else
                break;
        }
        consumer.close();
        session.close();
        connection.close();
    }

执行结果显示:
在这里插入图片描述
查看控制台目前已经有一个消费者:
在这里插入图片描述

如果采用监听器方式进行消费参考代码如下:

String brokerURL = "tcp://192.168.24.137:61616";
        //构造连接工厂实例对象
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
        //构造从工厂得到连接对象
        Connection connection = connectionFactory.createConnection();
        //启动
        connection.start();
        //获取操作连接
        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        //获取session,注意指定消息队列
        Queue queue = session.createQueue("7dGroup-test");
        // 创建消费者
        MessageConsumer consumer = session.createConsumer(queue);
       consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                if (null != message && message instanceof TextMessage) {
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("我收到一条消息: " + textMessage.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        try {
            //会一直执行获取数据
            System.in.read();
            consumer.close();
            session.close();
            connection.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

再次运行生产者,监听器会自动获取数据:
在这里插入图片描述
执行两次生产,执行一次监听器:
在这里插入图片描述

通过上面代码已经把 activemq 环境搭建好,现在开始修改代码为Jmeter 脚本,在修改jmeter脚本之前,需要引入 ApacheJMeter_functions 方法才能使用java 协议进行脚本开发。


 <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_functions -->
    <dependency>
        <groupId>org.apache.jmeter</groupId>
        <artifactId>ApacheJMeter_functions</artifactId>
        <version>${jmeter.version}</version>
    </dependency>

三、JMeter脚本二次开发环境搭建

在代码中新建一个 ActiveMQSampler 类并且继承 AbstractJavaSamplerClient 接口参考如下:

public class ActiveMQSamplerTest extends AbstractJavaSamplerClient {

    private String brokerURL;
    private String topic;
    private String message;
    // 判断是topic还是队列消息
    private String isTopMess;

    @Override
    public void setupTest(JavaSamplerContext context) {
        brokerURL = context.getParameter("brokerURL");
        topic = context.getParameter("topic");
        message = context.getParameter("message");
        isTopMess = context.getParameter("isTopMess");
    }


    @Override
    public SampleResult runTest(JavaSamplerContext sampleResult) {
        // 创建 Jmeter 请求结果
        SampleResult result = new SampleResult();
        try {
            // 创建消息
            Producer msg = new Producer();
            msg.SedProducerTopMess(brokerURL, topic, message, isTopMess);
            // 请求开始
            result.sampleStart();
            result.sampleEnd();
            result.setSuccessful(true);
        } catch (Exception e) {
            //e.printStackTrace();
            result.sampleEnd();
            result.setSuccessful(false);
        }

        return result;
    }

    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("brokerURL", "tcp://localhost:61616");
        params.addArgument("topic", "testTopic");
        params.addArgument("message", "testTag");
        params.addArgument("isTopMess", "queue");
        return params;
    }
}

生成消息改造后的代码,如下:

/**
     * 是否发送 topic 与队列的区别
     *
     * @param brokerURL
     * @param topicStr
     * @param messageStr
     * @param isTopMess
     */
    public void SedProducerTopMess(String brokerURL, String topicStr, String messageStr, String isTopMess) {
        try {
            //构造连接工厂实例对象
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
            //构造从工厂得到连接对象
            Connection connection = connectionFactory.createConnection();
            //启动
            connection.start();
            //获取操作连接
            Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
            //获取session,注意指定消息队列
            MessageProducer producer;
            if (isTopMess.equals("queue")) {
                Queue queue = session.createQueue(topicStr);
                producer = session.createProducer(queue);
            } else {
                Topic topic = session.createTopic(topicStr);
                //消息的目的地,消息发给谁
                producer = session.createProducer(topic);
            }
            logger.info("目前发送主题为:" + topicStr + ",的消息为:" + messageStr);
            //消息发送者
            //构造消息,此处写死,项目就是参数,或者方法获取
            TextMessage message = session.createTextMessage(messageStr);
            producer.send(message);
            producer.close();
            session.close();
            connection.close();
        } catch (JMSException e) {
            throw new RuntimeException(e);
        }
    }

接下来把代码编译成 jar 放入 jmeter 中的 lib/ext下,如果想把依赖都一起打成 jar,请参考pom文件如下:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <!--            依赖包-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <encoding>utf-8</encoding>
                    <resources>
                        <resource>
                            <directory>${basedir}/src/main/resources</directory>
                            <includes>
                                <include>**/*.xml</include>
                                <include>**/*.config</include>
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>io.pef.mq</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

编程后如:

在这里插入图片描述
复制包,如下图:

在这里插入图片描述
接下来打开 JMeter 验证脚本是否可以用?
在这里插入图片描述

修改地址,进行发送消息测试:

在这里插入图片描述
开启监听器消费,需要修改当前 JMeter发送的主题如下:
在这里插入图片描述
再次执行 JMeter 进行生存消息,代码执行消息如下:
在这里插入图片描述

结果如下:

在这里插入图片描述
再次打开控制台如:

在这里插入图片描述
到这里脚本已经全部开发完毕,希望对大家有一点帮助。


http://www.kler.cn/a/501065.html

相关文章:

  • 【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿
  • 一键整理背包界面功能
  • 专题 - STM32
  • Mac——Docker desktop安装与使用教程
  • 二叉搜索树
  • LS1046+XILINX XDMA PCIE调通
  • AIGC:开启内容创作的新纪元
  • maven发包because “server“ is null
  • 基于单片机的数字电能表(论文+源码)
  • 2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)
  • 激活conda
  • models/ gitignore是根目录下的models目录,不包括子目录的models目录,怎么写
  • 人工智能之基于阿里云快速搭建Llama-3.2-11B-Vision-Instruct
  • 用 Python 从零开始创建神经网络(十九):真实数据集
  • 【Cocos TypeScript 零基础 7.1】
  • Android Compose 显示底部对话框 (ModalBottomSheet),实现类似BottomSheetDialog的效果
  • (五)ROS通信编程——参数服务器
  • 多 Agent 框架入门:开启智能协作新时代(24/30)
  • 2025年01月11日Github流行趋势
  • 通义文生视频模型升级,天工推理模型正式上线,微软开源小模型Phi-4!AI Weekly『1月6-1月12日』
  • CV 图像处理基础笔记大全(超全版哦~)!!!
  • 什么是PHP?
  • MR30分布式 IO 在物流分拣线的卓越应用
  • 小米路由器IPv6 功能使用指南
  • 【vscode】VSCode 设置ctrl或alt+mouse(left)跳转到定义
  • 书说 MySQL 的悲观锁和乐观锁