Jmeter单个长连接发送多个Sample
Mark自:https://blog.csdn.net/lykangjia/article/details/16337505
|
1 package tea.client.network;
2 /**
3 * @author Teaey
4 * @creation 2012-8-25
5 */
6 public class NetworkClientHolder
7 {
8 /**
9 * 这里使用ThradLocal存储BaseClient
10 * 方便一轮测试的每个sample都是由同一个socketChannel发送
11 * 更真实的模拟用户
12 */
13 private static ThreadLocal<BaseClient> clientHolder = new ThreadLocal<BaseClient>();
14 public static BaseClient getClient(String ip, String port)
15 {
16 BaseClient client = clientHolder.get();
17 if (null == client)
18 {
19 client = new BaseClient(ip, port);
20 client.connect();
21 clientHolder.set(client);
22 }
23 return client;
24 }
25 }
|
|
1 package tea.client.network;
2
3 import java.net.InetSocketAddress;
4 import java.util.concurrent.Executors;
5 import org.jboss.netty.bootstrap.ClientBootstrap;
6 import org.jboss.netty.channel.Channel;
7 import org.jboss.netty.channel.ChannelFuture;
8 import org.jboss.netty.channel.ChannelHandlerContext;
9 import org.jboss.netty.channel.ChannelPipeline;
10 import org.jboss.netty.channel.ChannelPipelineFactory;
11 import org.jboss.netty.channel.ChannelStateEvent;
12 import org.jboss.netty.channel.Channels;
13 import org.jboss.netty.channel.ExceptionEvent;
14 import org.jboss.netty.channel.MessageEvent;
15 import org.jboss.netty.channel.SimpleChannelHandler;
16 import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
17 import tea.common.network.ClientDecoder;
18 import tea.common.network.ClientEncoder;
19 import tea.common.network.ClientMessage;
20
21 /**
22 * @author Teaey
23 * @creation 2012-8-25
24 */
25 public class BaseClient
26 {
27 public BaseClient(String ip, String port)
28 {
29 this.ip = ip;
30 this.port = port;
31 }
32 private String ip;
33 private String port;
34 private Channel channel;
35 private ClientBootstrap bootstrap;
36 private Object syn = new Object();
37 private static final int Receive_Timeout = 10000; //ms
38 private ClientMessage response = null;
39 public void connect()
40 {
41 bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
42 bootstrap.setOption("tcpNoDelay", true);
43 bootstrap.setPipelineFactory(new ClientPipelineFactory());
44 while (true)
45 {
46 ChannelFuture future = bootstrap.connect(new InetSocketAddress(ip, Integer.parseInt(port)));
47 future.awaitUninterruptibly(5000);
48 if (future.isDone())
49 {
50 channel = future.getChannel();
51 if (channel != null && channel.isConnected())
52 {
53 break;
54 }
55 }
56 }
57 }
58 public void disconnect()
59 {
60 if (channel.isConnected())
61 {
62 channel.disconnect();
63 }
64 }
65 public boolean isConnected()
66 {
67 return channel.isConnected();
68 }
69 public void close()
70 {
71 if (this.channel.isOpen())
72 {
73 this.channel.close();
74 }
75 bootstrap.releaseExternalResources();
76 }
77 /**
78 * 发送消息,无需返回
79 */
80 public void send(ClientMessage message)
81 {
82 channel.write(message);
83 }
84 /**
85 * 发送消息,等待返回
86 */
87 public ClientMessage sendWaitBack(ClientMessage message)
88 {
89 response = null;
90 try
91 {
92 channel.write(message);
93 synchronized (syn)
94 {
95 try
96 {
97 syn.wait(Receive_Timeout);
98 } catch (InterruptedException e)
99 {
100 e.printStackTrace();
101 }
102 }
103 if (null == response)
104 {
105 System.err.println("Receive response timeout");
106 }
107 } catch (Exception e)
108 {
109 e.printStackTrace();
110 }
111 return response;
112 }
113 class ClientPipelineFactory implements ChannelPipelineFactory
114 {
115 public ChannelPipeline getPipeline() throws Exception
116 {
117 ChannelPipeline p = Channels.pipeline();
118 p.addLast("frameDecoder", new ClientDecoder());
119 p.addLast("fremeEncoder", new ClientEncoder());
120 p.addLast("logicHandler", new ClientMsgHandler());
121 return p;
122 }
123 }
124 class ClientMsgHandler extends SimpleChannelHandler
125 {
126 public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception
127 {
128 Object obj = e.getMessage();
129 if (obj instanceof ClientMessage)
130 {
131 ClientMessage msg = (ClientMessage) obj;
132 response = msg;
133 synchronized (syn)
134 {
135 syn.notifyAll();
136 }
137 }
138 }
139 public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception
140 {
141 System.out.println("connected server:" + ctx.getChannel());
142 }
143 public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception
144 {
145 System.out.println("disconnected server:" + ctx.getChannel());
146 }
147 public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception
148 {
149 System.out.println("Error in exceptionCaught:" + e.getCause());
150 }
151 }
152 }
|
|
1 package tea.client.network;
2
3 import org.apache.jmeter.config.Arguments;
4 import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
5 import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
6 import org.apache.jmeter.samplers.SampleResult;
7 import com.google.protobuf.InvalidProtocolBufferException;
8 import com.google.protobuf.MessageLite;
9
10 /**
11 * @author Teaey
12 * @creation 2012-8-25
13 */
14 public abstract class BaseSample extends AbstractJavaSamplerClient
15 {
16 public static final String PARAM_IP = "ip";
17 public static final String PARAM_PORT = "port";
18 public static final String VAR_IP = "${ip}";
19 public static final String VAR_PORT = "${port}";
20 protected BaseClient client;
21 public void addParameter(Arguments params)
22 {
23 }
24 /**
25 * Jmeter获取消息参数,默认配置ip和port两个参数
26 * 如果子类有更多参数,调用super.getDefaultParameters()获取Arguments后,继续设置其他方法
27 */
28 @Override
29 public Arguments getDefaultParameters()
30 {
31 System.out.println("1.getDefaultParameters");
32 Arguments params = new Arguments();
33 params.addArgument(PARAM_IP, VAR_IP);
34 params.addArgument(PARAM_PORT, VAR_PORT);
35 addParameter(params);
36 return params;
37 }
38 /**
39 * runTest的前置方法
40 */
41 @Override
42 public void setupTest(JavaSamplerContext context)
43 {
44 System.out.println("2.setupTest:" + context.containsParameter(PARAM_IP));
45 String ip = context.getParameter(PARAM_IP);
46 String port = context.getParameter(PARAM_PORT);
47 this.client = NetworkClientHolder.getClient(ip, port);
48 System.out.println("thread--->" + Thread.currentThread().getId() + " client--->" + client);
49 }
50 /**
51 * Jmeter调用,用于实际的测试
52 */
53 @Override
54 public SampleResult runTest(JavaSamplerContext context)
55 {
56 SampleResult sample = getSample();
57 sample.sampleStart();
58 try
59 {
60 MessageLite response = doTest();
61 String msg = response == null ? "" : response.toString();
62 sample.setResponseMessage(msg);
63 sample.setSuccessful(true);
64 } catch (Exception e)
65 {
66 sample.setSuccessful(false);
67 e.printStackTrace();
68 } finally
69 {
70 sample.sampleEnd();
71 }
72 return sample;
73 }
74 /**
75 * 获取本Sample的标签,子类实现
76 */
77 public abstract String getLabel();
78 /**
79 * 获取一个带标签的Sample
80 */
81 public SampleResult getSample()
82 {
83 SampleResult sample = new SampleResult();
84 sample.setSampleLabel(getLabel());
85 return sample;
86 }
87 /**
88 * Jmeter调用,用于
89 */
90 @Override
91 public void teardownTest(JavaSamplerContext context)
92 {
93 System.out.println("4.teardownTest");
94 }
95 /**
96 * 需实现,具体测试的方法,调用client的send/sendWithBack发送请求
97 * 如无返回,放回null即可
98 */
99 public abstract MessageLite doTest() throws InvalidProtocolBufferException;
100 }
|
|
1 package tea.client;
2
3 import com.google.protobuf.InvalidProtocolBufferException;
4 import com.google.protobuf.MessageLite;
5 import tea.client.network.BaseSample;
6 import tea.common.network.ClientMessage;
7 import tea.common.network.RPC.HeartBeat_C2S;
8 import tea.common.network.RPC.HeartBeat_S2C;
9
10 /**
11 * @author Teaey
12 * @creation 2012-8-24
13 */
14 public class HeartBeatSample extends BaseSample
15 {
16 @Override
17 public MessageLite doTest() throws InvalidProtocolBufferException
18 {
19 HeartBeat_C2S.Builder request = HeartBeat_C2S.newBuilder();
20 request.setTimestamp(System.currentTimeMillis());
21 ClientMessage cm = new ClientMessage();
22 cm.setContent(request.build().toByteArray());
23 cm.setName("HeartBeat");
24 ClientMessage sm = client.sendWaitBack(cm);
25 HeartBeat_S2C response = HeartBeat_S2C.parseFrom(sm.getContent());
26 return response;
27 }
28 @Override
29 public String getLabel()
30 {
31 return "HeartBeatSample";
32 }
33 }
|
Jmeter单个长连接发送多个Sample的更多相关文章
- JMeter 使用 http长连接 |史上最全
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版本的 高并发秒杀: ...
- JMeter 使用 http长连接的方法
前言 如果需要在JMeter通过http长连接发送请求,首先需要选择了Use KeepAlive 长连接协议,虽然默认是勾选的,但也需要确认一下. 除了选择了Use KeepAlive 长连接协议,还 ...
- Nginx upstream 长连接
原文: http://bollaxu.iteye.com/blog/900424 Nginx upstream目前只有短连接,通过HTTP/1.0向后端发起连接,并把请求的"Connecti ...
- 转:基于ASP.NET的Comet长连接技术解析
原文来自于: Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的 ...
- 关于TCP长连接和发送心跳的一些理解
原因 TCP是一种有连接的协议,但是这个连接并不是指有一条实际的电路,而是一种虚拟的电路.TCP的建立连接和断开连接都是通过发送数据实现的,也就是我们常说的三次握手.四次挥手.TCP两端保存了一种数据 ...
- 实现单台测试机6万websocket长连接
本文由作者郑银燕授权网易云社区发布. 本文是我在测试过程中的记录,实现了单台测试机发起最大的websocket长连接数.在一台测试机上,连接到一个远程服务时的本地端口是有限的.根据TCP/IP协议,由 ...
- 170122、Netty 长连接服务
推送服务 还记得一年半前,做的一个项目需要用到 Android 推送服务.和 iOS 不同,Android 生态中没有统一的推送服务.Google 虽然有 Google Cloud Messaging ...
- Netty 长连接服务
转自:https://www.dozer.cc/2014/12/netty-long-connection.html 推送服务 还记得一年半前,做的一个项目需要用到 Android 推送服务.和 iO ...
- HTTP的长连接和短连接
本文总结&分享网络编程中涉及的长连接.短连接概念. 关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...
随机推荐
- 目标检测 非极大值抑制(Non-Maximum Suppression,NMS)
非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.也可以理解为只取置信度最高的一个识别结果. 举例:  如图所示,现在 ...
- 1.3创建项目「深入浅出ASP.NET Core系列」
控制台创建项目 dotnet new --help 使用控制台采集项目,务必要熟练使用命令,--help是命令帮助的指明灯,在你无法google的时候,可以离线状态最快的帮助到你. 根据模板名称,我们 ...
- LeetCode矩阵题型
以三角形遍历矩阵 ; i < matrix.size(); ++i) { ; j < matrix[i].size(); ++j) swap(matrix[i][j], matrix[j] ...
- C# 曲线上的点(二) 获取距离最近的点
如何在一条曲线上,获取到距离指定点最近的点位置? 与上一篇 C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值 类似, 我们通过曲线上获取的密集点,通过俩点之间连线,获取连线上最近的点.我们能够获取 ...
- 从QA到工程能效团队
Engineering Productivity Productivity is our job; testing and quality are the job of everyone involv ...
- 简简单单的Vue2(简单语法,生命周期,组件)
既然选择了远方,便只顾风雨兼程! __HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 简单入手 组件 在上面文章,我们简单的讲了前端框架的工程化,也就是MVVM,还有特别聊 ...
- Spring Tool Suite4(sts)复制粘贴卡顿(ctrl+v, ctrl+c)、按住ctrl也很卡
最近在看<Spring in Action, Fifth Edition>,下载了Spring Tool Suite4,在使用的过程中发现了一些问题: 只要在复制粘贴(ctrl+c, ct ...
- Java运行时数据区概述
Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,如图所示: 程序计数器 程序计数器是一块比较小的内存空间,可以看作是当前线程所执行的字节 ...
- 在 Angular 8 中,我们可以期待些什么
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文由葡萄城翻译并发布 --- Angular 作为一款优秀的前端框架,自诞生之日起,就致力于面向前端开发者 ...
- 阅读笔记:基础知识(Java篇)
1. GC机制(垃圾回收机制) 找到垃圾的方法:引用计数法.可达性分析法 回收垃圾的方法:标记清除算法.复制算法.标记整理法.分代算法 2. JVM内存划分 线程私有:程序计数器.JVM虚拟机栈.本地 ...