高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

nGrinder activeMQ 消息发送脚本

目录
  1. 1. 使用spring&&jmstemplate发送mq消息

最近有个项目想测试mq平台的性能,顺便测试自身业务的消费能力。

本帅心里其实是拒绝的,MQ本身的性能实际上不需要做测试(公司MQ平台已上线多年,日均几十亿的流量完全没问题,该业务只有几百tps的消费能力),这种把消息抛出去没有返回的业务挺难过的。无奈项目组强烈要求,只能当成测试业务消费能力了。

由于无法直接得知消息的消费情况,与项目组商议,从业务数据的入库情况,计算每秒入库的数据作为TPS。

言归正传,来看看怎么写mq消息发送的脚本。


使用spring&&jmstemplate发送mq消息

spring和jms的jar包(未筛选,比较多杂)
https://pan.baidu.com/s/1cGQe5AJw2hMj-dyQPW9vBw

项目组提供mq配置信息,新建配置文件:applicationContext.xml

Alt text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-3.0.xsd"

default-autowire="byName">


<!-- WMQ连接工厂-->
<bean id="connectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
<!-- 交互类型 -->
<property name="transportType">
<util:constant static-field="com.ibm.mq.jms.JMSC.MQJMS_TP_CLIENT_MQ_TCPIP" />
</property>
<!-- 管理器名称 -->
<property name="queueManager" value="LCBPS_QM" />
<!-- ip地址 -->
<property name="hostName" value="10.244.154.221" />
<!-- 通道名称 -->
<property name="channel" value="LCBPS_CHANNEL" />
<!-- 端口号 -->
<property name="port" value="1432" />
<!-- 创建服务设置的CCSID 字符编码ID 437表示usa,1208表示UTF-8 Level 3 -->
<property name="CCSID" value="1208" />
</bean>

<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory"/>
</bean>

<!-- 工厂连接适配器 -->
<bean id="connectionFactoryAdapter" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="connectionFactory"/>
</bean>

<!-- 监听MQ收取队列信息的配置-->
<jms:listener-container container-class="org.springframework.jms.listener.DefaultMessageListenerContainer"
connection-factory="connectionFactoryAdapter" concurrency="5">

</jms:listener-container>

</beans>

编写grinder 测试脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package BpsSendBatchApplyQueue

import static net.grinder.script.Grinder.grinder
import java.util.List;
import net.grinder.plugin.http.HTTPRequest
import net.grinder.plugin.http.HTTPPluginControl
import net.grinder.script.GTest
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import com.alibaba.fastjson.JSONObject;
import static org.junit.Assert.*
import HTTPClient.Cookie
import HTTPClient.CookieModule
import HTTPClient.HTTPResponse
import HTTPClient.NVPair
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import javax.jms.JMSException;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import com.suning.fsp.common.mq.batchapply.dto.BpsBatchApplyAcceptance;
import com.suning.fsp.common.mq.batchpay.dto.BpsBatchPayAcceptance;
import com.suning.fsp.common.mq.eft.dto.BpsEftDetailAcceptance;
import com.suning.fsp.common.mq.utils.JmsUtils;


@RunWith(GrinderRunner)
class BpsSendBatchApplyQueueTestRunner {

public static GTest test;
/**
* jms模板,封装链接工厂、队列、消息生产者
*/
private static JmsTemplate jmsTemplate;

// spring上下文
private ApplicationContext ctx = null;
private String SPRING_FILE_NAME = "applicationContext_BPS.xml";
private String JMS_TEMPLATE_NAME = "jmsTemplate";
private String QUENE_NAME = "Bps_SendBatchApply_Queue"; //queue name

{
ctx = new ClassPathXmlApplicationContext(SPRING_FILE_NAME);
jmsTemplate = (JmsTemplate) ctx.getBean(JMS_TEMPLATE_NAME);
jmsTemplate.setDefaultDestinationName(QUENE_NAME);
}

Object obj;

@BeforeProcess
public static void beforeProcess() {
test = new GTest(1, "发送消息")
}

@BeforeThread
public void beforeThread() {
test.record(this, "test")
}

@Before
public void before() {

obj = new Object();

}

@Test
public void test(){
try{
JmsUtils.sendObjMsg(jmsTemplate, obj, QUENE_NAME);
System.out.println("发送完成");
assertTrue(true);

}catch(Exception e){
println "error"+e
}

}

}

运行脚本时,将配置文件放在lib目录下即可。