Появилось желание протестить серверок POST запросами. Написал маленький классик, к нему тред и вроде счастлив - даже результаты получаю, но не долго радовался. Послал те же запросы через JMeter и расстроился. Результаты - время обработка запроса полученные с помощью JMeter в 10 раз меньше чем в моем коде.
public class ApacheHttpPostSender { static File dataFolder = new File("~/data"); static ArrayList<File> files = new ArrayList(); static ArrayList<HttpPost> posts = new ArrayList(); static int tNumber = 10; static int tInterval = 1000; public static void main(String[] args) { HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("http:xxx.xxx.xxx/sendMessage"); for (final File fileEntry : dataFolder.listFiles()) { if (fileEntry.isDirectory()) continue; files.add(fileEntry); } for (int i = 0; i < tNumber; i++) { MultipartEntity entity = new MultipartEntity (); try { FileBody fileBody = new FileBody(files.get((new Random()).nextInt(files.size())), "image/jpeg"); entity.addPart("content", fileBody); entity.addPart("json", new StringBody("{to:98768765454376565987670987,type:image}")); entity.addPart("token", new StringBody("bvcnbvcjgfglnbmnbcbvxjg_654309")); //entity. } catch (IOException ioe) { ioe.printStackTrace(); } post.setEntity(entity); posts.add(post); } for (int i = 0; i < posts.size(); i++) { (new ApacheHttpPostSenderThread(posts.get(i), i, (new Random()).nextInt(tInterval))).start(); } } }
Время запроса меряю как
long tBefore = System.currentTimeMillis(); HttpResponse response = client.execute(post); long tAfter = System.currentTimeMillis();
Вроде все примитивнее не придумаешь... Но результаты разнятся...
public class ApacheHttpPostSenderThread extends Thread { private HttpPost post; private int delay_miliseconds; private int thread_index; ApacheHttpPostSenderThread(HttpPost post, int thread_index, int delay_miliseconds) { super(); this.post = post; this.delay_miliseconds = delay_miliseconds; this.thread_index = thread_index; } public void run() { try { long heapSize = Runtime.getRuntime().totalMemory(); Thread.sleep(delay_miliseconds); HttpClient client = new DefaultHttpClient(); System.out.println("Thread " + this.thread_index + ": START!!! "); long tBefore = System.currentTimeMillis(); HttpResponse response = client.execute(post); long tAfter = System.currentTimeMillis(); client.getConnectionManager().shutdown(); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = ""; while ((line = rd.readLine()) != null) { System.out.println(line); } System.out.println(" ---> " + (tAfter - tBefore) + " miliseconds."); } catch (Throwable tex) { tex.printStackTrace(); } } }
Может я что-то пропустил и мой код немыслимо тормозит, может Jmeter где-то что-то не то меряет...
Пробовал посылать и сановским HttpUrlConnection и апаческим Http клиентом. Результаты и них похожи но с JMeter не совпадают...
В чем может быть проблема?