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

embedded/2025/1/16 3:43:19/

文章目录

  • 一、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());} elsebreak;}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() {@Overridepublic 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;@Overridepublic void setupTest(JavaSamplerContext context) {brokerURL = context.getParameter("brokerURL");topic = context.getParameter("topic");message = context.getParameter("message");isTopMess = context.getParameter("isTopMess");}@Overridepublic 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;}@Overridepublic 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.ppmy.cn/embedded/154294.html

相关文章

青少年编程与数学 02-006 前端开发框架VUE 17课题、组件深入

青少年编程与数学 02-006 前端开发框架VUE 17课题、组件深入 一、组件注册组件注册全局注册局部注册组件名格式 二、propsPropsProps 声明响应式 Props 解构将解构的 props 传递到函数中传递 prop 的细节Prop 名字格式静态 vs. 动态 Props传递不同的值类型NumberBooleanArrayOb…

【Oracle专栏】group by 和distinct 效率

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 查阅资料&#xff1a; 1&#xff09;有索引情况下&#xff0c;group by和distinct都能使用索引&#xff0c;效率相同。 2&#xff09;无索引情况下&#xff0c;distinct…

使用 TiDB 的几个优秀 Tips

使用 TiDB 的几个优秀 Tips TiDB 作为一款分布式数据库&#xff0c;具有强大的功能和高可用性&#xff0c;但也因为其分布式架构的特点&#xff0c;使用时有一些需要特别注意的地方。掌握一些技巧和最佳实践&#xff0c;可以帮助你更好地使用 TiDB&#xff0c;提升系统的性能和…

【HarmonyOS Next NAPI 深度探索2】N-API 的工作机制与架构

【HarmonyOS Next NAPI 深度探索2】N-API 的工作机制与架构 如果你听说过 N-API&#xff0c;但还不太了解它的作用和背后的工作机制&#xff0c;那这篇文章会帮你捋清楚它的结构和原理。N-API 是 Node.js 提供的一个强大工具&#xff0c;专门用于开发高性能、可维护的原生模块…

day13-第一次摸底考试题及讲解

老男孩Linux77期第二周测试题&#xff1a; 01&#xff09;请在/opt下创建oldboyedu目录&#xff0c;并在oldboyedu目录下创建dir1到dir5&#xff0c;共5个目录。 方法1&#xff1a; [rootoldboy ~]# mkdir /opt/oldboyedu -p [rootoldboy ~]# mkdir /opt/oldboyedu/dir{1…5}…

《拉依达的嵌入式\驱动面试宝典》—Linux篇(二)_uboot

《拉依达的嵌入式\驱动面试宝典》—Linux篇(二)_uboot 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

【CI/CD构建】关于不小心将springMVC注解写在service层

背景 之前写一个接口的时候没有察觉到将RequestBody这个注解带到service层了。 今天提交代码的时候&#xff0c;插件没有检测到这个低级错误&#xff0c;导致试飞构建连maven编译都过不了&#xff0c;maven找不到程序包org.springframework.web.bind.annotation这个包 结果…

Android SystemUI——服务启动流程(二)

在 Andorid 系统源码中,package/apps下放的是系统内置的一些 APP,例如 Settings、Camera、Phone、Message 等等。而在 framework/base/package 下,它们也是系统的 APP,SystemUI 就在此目录下。它控制着整个 Android 系统的界面,但其实他也是一个 APP,不同于一般的 APP,它…