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

文章目录

一、ActiveMQ环境搭建

1.1、控制台环境搭建

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

注意:

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

进入目录后显示:

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

配置JDK路径:

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

启动服务命令 service activemq start

bash 复制代码
[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,即广播地址。

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>

    <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 文件中输入:

bash 复制代码
<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>

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

java 复制代码
 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 发送消息,代码修改一个地方即可,如下图:

参考代码如下:

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

执行代码查看控制台:

在查看 Queues没有增加数据:

消费者搭建,参考代码:

java 复制代码
 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();
    }

执行结果显示:

查看控制台目前已经有一个消费者:

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

java 复制代码
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 协议进行脚本开发。

bash 复制代码
 <!-- 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 接口参考如下:

java 复制代码
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;
    }
}

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

java 复制代码
/**
     * 是否发送 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文件如下:

xml 复制代码
<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 进行生存消息,代码执行消息如下:

结果如下:

再次打开控制台如:

到这里脚本已经全部开发完毕,希望对大家有一点帮助。

相关推荐
Feng.Lee1 小时前
性能测试工具Jmeter中的FTP脚本开发
测试工具·jmeter
Feng.Lee1 小时前
性能测试工具Jmeter元件运行顺序
测试工具·jmeter·可用性测试
ba_pi6 小时前
Helm部署activemq
activemq
测试杂货铺12 小时前
Jmeter随机参数各种搭配
自动化测试·软件测试·python·测试工具·jmeter·职场和发展·测试用例
字节程序员17 小时前
Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台
jmeter·docker·grafana
cmgdxrz1 天前
金融项目实战 03|JMeter脚本实现手工接口测试
jmeter·金融·接口测试
CesareCheung2 天前
Jmeter-压测时接口如何按照顺序执行
jmeter
互联网杂货铺2 天前
Jmeter全流程性能测试实战
自动化测试·软件测试·测试工具·jmeter·测试用例·压力测试·性能测试