サーバーに接続されたJavaソケットを使用しています。 HEADER httpリクエストを送信した場合、サーバーからの応答時間をどのように測定できますか?提供されているJavaタイマーを使用する必要がありますか、それとももっと簡単な方法がありますか?
短い答えを探しています。他のプロトコルなどを使用したくありません。明らかに、自分のアプリケーションを特定のOSに結び付けるソリューションも必要ありません。 IN-CODEソリューションのみを提供してください。
それは、測定しようとしている正確な間隔、送信する要求の最後のバイトから受信する応答の最初のバイトまでの時間に依存すると思いますか?または、応答全体が受信されるまで?または、サーバー側の時間のみを測定しようとしていますか?
サーバー側の処理時間のみを測定しようとすると、リクエストが到着してレスポンスが返されるまでにネットワークの通過に費やされた時間を計算するのが困難になります。それ以外の場合は、ソケットを介してリクエストを自分で管理しているため、システムクロックを確認して差を計算することにより、任意の2つの瞬間間の経過時間を測定できます。例えば:
public void sendHttpRequest(byte[] requestData, Socket connection) {
long startTime = System.currentTimeMillis();
writeYourRequestData(connection.getOutputStream(), requestData);
byte[] responseData = readYourResponseData(connection.getInputStream());
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Total elapsed http request/response time in milliseconds: " + elapsedTime);
}
このコードは、リクエストの書き込みを開始してからレスポンスの受信が完了するまでの時間を測定し、結果を出力します(特定の読み取り/書き込みメソッドが実装されていると想定しています)。
curl -s -w "%{time_total}\n" -o /dev/null http://server:3000
コマンドラインでは、time、curl、timeを使用できます。 curlの-I引数は、ヘッダーのみを要求するように指示します。
time curl -I 'http://server:3000'
このような何かがうまくいくかもしれません
import Java.io.IOException; import org.Apache.commons.httpclient.HttpClient; import org.Apache.commons.httpclient.HttpMethod; import org.Apache.commons.httpclient.URIException; import org.Apache.commons.httpclient.methods.HeadMethod; import org.Apache.commons.lang.time.StopWatch ; // import org.Apache.commons.lang3.time.StopWatch public class Main { public static void main(String [] args)がURIExceptionをスローします{ StopWatch watch = new StopWatch(); HttpClient client = new HttpClient(); HttpMethod method = new HeadMethod( "http:// stackoverflow .com /"); { watch.start(); client.executeMethod(method); } try(IOException e){ e.printStackTrace(); }最後に{ watch.stop(); } システム.out.println(St ring.format( "%s%s%d:%s"、method.getName()、method.getURI()、method.getStatusCode()、watch.toString())); } }
HEAD http://stackoverflow.com/ 200:0:00:00.404
多分私は何かが欠けているかもしれませんが、なぜあなたは単に使用しないのですか?
// open your connection
long start = System.currentTimeMillis();
// send request, wait for response (the simple socket calls are all blocking)
long end = System.currentTimeMillis();
System.out.println("Round trip response time = " + (end-start) + " millis");
AOPを使用してソケットへの呼び出しをインターセプトし、応答時間を測定します。
@Aspect
@Profile("performance")
@Component
public class MethodsExecutionPerformance {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Pointcut("execution(* it.test.microservice.myService.service.*.*(..))")
public void serviceMethods() {
}
@Around("serviceMethods()")
public Object monitorPerformance(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch(getClass().getName());
stopWatch.start();
Object output = proceedingJoinPoint.proceed();
stopWatch.stop();
logger.info("Method execution time\n{}", stopWatch.prettyPrint());
return output;
}
}
このようにして、ネットワーク速度に関係なく、サービスの実際の応答時間を計算できます。