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 ... 
随机推荐
- 文本分布式表示(一):word2vec理论
			Word2vec是Google的Mikolov等人提出来的一种文本分布式表示的方法,这种方法是对神经网络语言模型的“瘦身”, 巧妙地运用层次softmax(hierarchical softmax ) ... 
- 【Android Studio安装部署系列】四、Android SDK目录和作用分析
			版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android SDk Tool软件开发工具包(software development kit).被软件开发工程师用于为特定的软件 ... 
- 8-Flink中的窗口
			戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ... 
- k8s集群监控(十一)--技术流ken
			Weave Scope 在我之前的docker监控中<Docker容器监控(十)--技术流ken>就已经提到了weave scope. Weave Scope 是 Docker 和 K ... 
- 兼容小程序的canvas画图组件jmGraph
			基于CANVAS的简单画图组件让你用类似于dom的方式,在canvas上画图,感觉会不会很爽. 主页:http://graph.jm47.com/示例:http://graph.jm47.com/ex ... 
- C#工具:ASP.NET MVC单例模式(懒汉)实现文件上传
			1.SingletonConfigRead帮助类 using System; using System.Collections.Generic; using System.IO; using Syst ... 
- FineUIMvc表格数据库分页,使用CYQ.Data组件
			首先看下前台 View 的定义: @(F.Grid() .EnableCheckBoxSelect(true) .Width(850) .ShowHeader(true) .ShowBorder(tr ... 
- java爬虫系列第四讲-采集"极客时间"专栏文章、视频专辑
			1.概述 极客时间(https://time.geekbang.org/),想必大家都知道的,上面有很多值得大家学习的课程,如下图: 本文主要内容 使用webmagic采集极客时间中某个专栏课程生成h ... 
- java的设计模式 - 单例模式
			java 面试中单例模式基本都是必考的,都有最推荐的方式,也不知道问来干嘛.下面记录一下 饿汉式(也不知道为何叫这个名字) public class Singleton { private stati ... 
- Django 创建一个返回当前时间的页面
			创建一个 Django 项目及应用 django-admin startproject mysite cd mysite # 手动创建一个 templates 文件夹用来保存 html 文件 mkdi ... 
