[java] 模拟QPS
在WEB服务器端,每日的访问量巨大。在非生产环境需要对服务器进行压力测试,一般使用后台线程和Sleep方式来模拟线上的压力。这里使用ScheduledExecutorService实现一种简单的QPS测试代码。
QpsProxy:
import com.google.common.base.Preconditions;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; /**
* 若Runable执行的时间超过 MAX_QPS / qps,则实际的QPS会低于实际的值。
*/
public class QpsProxy { private final Logger logger = LoggerFactory.getLogger(QpsProxy.class); private final static int MAX_QPS = 1000; private ScheduledExecutorService scheduledExecutorService; private long qps = NumberUtils.LONG_ONE; private Runnable runnable; private long delay2Start = NumberUtils.INTEGER_ZERO; private int threads = 10; public QpsProxy() {
} public ScheduledExecutorService getScheduledExecutorService() {
return scheduledExecutorService;
} public void setScheduledExecutorService(ScheduledExecutorService scheduledExecutorService) {
this.scheduledExecutorService = scheduledExecutorService;
} public long getQps() {
return qps;
} public void setQps(long qps) {
Preconditions.checkArgument(qps < MAX_QPS , "设置的qps超过上限值:" + MAX_QPS);
this.qps = qps;
} public Runnable getRunnable() {
return runnable;
} public void setRunnable(Runnable runnable) {
this.runnable = runnable;
} public long getDelay2Start() {
return delay2Start;
} public void setDelay2Start(long delay2Start) {
this.delay2Start = delay2Start;
} public int getThreads() {
return threads;
} public void setThreads(int threads) {
this.threads = threads;
} public void start() {
Preconditions.checkNotNull(runnable, "请设置执行的任务");
long period = (long) Math.floor((double) MAX_QPS / qps);
logger.info("间隔周期:{}ms", period);
scheduledExecutorService = Executors.newScheduledThreadPool(threads);
scheduledExecutorService.scheduleAtFixedRate(runnable, delay2Start,
period, TimeUnit.MILLISECONDS);
} public void stop() {
Preconditions.checkNotNull(scheduledExecutorService, "任务未开始");
scheduledExecutorService.shutdown();
}
}
构建工具:
import com.google.common.base.Preconditions;
public class QpsProxyBuilder {
private QpsProxy qpsProxy = new QpsProxy();
public static QpsProxyBuilder newBuilder() {
return new QpsProxyBuilder();
}
public QpsProxyBuilder withDelay2Start(long delay2TimeByMillisSeconds) {
Preconditions.checkArgument(delay2TimeByMillisSeconds > 0);
qpsProxy.setDelay2Start(delay2TimeByMillisSeconds);
return this;
}
public QpsProxyBuilder withQps(long qps) {
Preconditions.checkArgument(qps > 0);
qpsProxy.setQps(qps);
return this;
}
public QpsProxyBuilder withRunnable(Runnable runnable) {
Preconditions.checkNotNull(runnable);
qpsProxy.setRunnable(runnable);
return this;
}
public QpsProxyBuilder withThreads(int threads) {
Preconditions.checkNotNull(threads > 0);
qpsProxy.setThreads(threads);
return this;
}
public QpsProxy build() {
return qpsProxy;
}
}
测试代码:
import com.qunar.hotel.qps.QpsProxy;
import com.qunar.hotel.qps.QpsProxyBuilder;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class qps { private final Logger logger = LoggerFactory.getLogger(getClass()); @Test
public void testBasic() throws InterruptedException {
QpsProxy proxy = QpsProxyBuilder.newBuilder().withQps(100).withThreads(1).withDelay2Start(4000).withRunnable(new Runnable() {
private int counter = 0; @Override
public void run() {
logger.info("{}-{}:{}", Thread.currentThread().getName(), System.nanoTime(), counter++);
}
}).build(); proxy.start();
Thread.currentThread().sleep(5020L);
proxy.stop();
}
}
[java] 模拟QPS的更多相关文章
- java模拟post请求发送json
java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...
- java 模拟qq源码
java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip
- java模拟开锁
java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...
- Jsoup实现java模拟登陆
Jsoup实现java模拟登陆 2013-10-29 14:52:05| 分类: web开发|举报|字号 订阅 下载LOFTER我的照片书 | 1:如何获取cookies. 1.1 ...
- [Java] 模拟HTTP的Get和Post请求
在之前,写了篇Java模拟HTTP的Get和Post请求的文章,这篇文章起源与和一个朋友砍飞信诈骗网站的问题,于是动用了Apache的comments-net包,也实现了get和post的http请求 ...
- Java模拟登录系统抓取内容【转载】
没有看考勤的习惯,导致我的一天班白上了,都是钱啊,系统也不发个邮件通知下.... 为了避免以后还有类似状况特别写了个java模拟登录抓取考勤内容的方法(部分代码来自网络),希望有人修改后也可以 ...
- Java模拟登陆02【转载】
在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢? 方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时 ...
- java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱
//如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...
- 上curl java 模拟http请求
最近,我的项目要求java模拟http请求,获得dns解决 tcp处理过的信息特定的连接. java api提供urlConnection apache提供的httpClient都不能胜任该需求,二次 ...
随机推荐
- Python在线教程
Python 3.x的 http://www.ziqiangxuetang.com/python3/python3-stdlib.html 廖雪峰的官方网站 http://www.liaoxuefen ...
- C#面向对象(OOP)入门—第二天—多态和继承(继承)
介绍: 第一天的内容主要是不同情形下的方法重载.这一部分则主要讲面向对象中继承的概念.首先用一个要点图形来定义继承. 继承 一个简单的例子: ClassA: class ClassA:ClassB { ...
- C++11空指针: nullptr
参考[C++11]新特性--引入nullptr NULL 在C++中, 经常会用到空指针, 一般用NULL表示空指针, 但是NULL却是这样定义的 #ifndef NULL #ifdef __cplu ...
- 禅道BUG管理工具使用链接存储
http://www.zentao.net/book/zentaopmshelp/259.html
- Django基础之form组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- Redis实现分布式锁 php
一.分布式锁的作用: redis写入时不带锁定功能,为防止多个进程同时进行一个操作,出现意想不到的结果,so...对缓存进行插入更新操作时自定义加锁功能. 二.Redis的NX后缀命令 Redis有一 ...
- git 命令小结
一.git 版本管理 1.git log: 获取当前版本之前的所有操作 2.git log --pretty=oneline:获取当前版本的前三和后三个操作 3.git reflog :获取当前项目下 ...
- localStorage和sessionStorage的总结
localStorage:没有时间限制的数据存储 API: 1.localStorage.setItem('name','wangwei')/localStorage.name='wangwei'存储 ...
- ceph 安装记录
ceph 安装 http://docs.ceph.com/docs/master/start/quick-ceph-deploy/ 1. 系统要求 centos 7 systemctl disable ...
- 【ASP.NET MVC】HTML5+MVC上传文件显示进度
head> <title>Index</title> <style type="text/css"> #statusBorder { po ...