Web アプリケーションに AXIS2 サービスを実装しています。私たちのクライアントの生産ボックスは少し不安定なので、パフォーマンスが低下したときに注意したい. 具体的には:
- リクエストが AXIS2 サービスに届く
- リクエストにかかる時間を測定する
- 時間が X より大きい場合は、エラーをログに記録します
そこで、次のような AXIS2 モジュールを作成しました。
public class PerformanceHandler extends AbstractHandler implements Handler {
protected Logger logger = null;
public PerformanceHandler() {
logger = LoggerFactory.getLogger( this.getClass() );
}
public InvocationResponse invoke( MessageContext msgContext ) throws AxisFault {
HttpServletRequest r = ( HttpServletRequest )msgContext.getProperty( HTTPConstants.MC_HTTP_SERVLETREQUEST );
if( msgContext.getFLOW() == MessageContext.IN_FLOW || msgContext.getFLOW() == MessageContext.IN_FAULT_FLOW ) {
// incoming request
Date timeIn = new Date( System.currentTimeMillis() );
r.setAttribute( this.getClass().getName() + ".timeIn", timeIn );
if( logger.isDebugEnabled() ) {
logger.debug( "Request " + r.toString() + " started processing at " + timeIn );
}
} else {
// outgoing response
Date timeIn = ( Date )r.getAttribute( this.getClass().getName() + ".timeIn" );
Date timeOut = new Date( System.currentTimeMillis() );
if( logger.isDebugEnabled() ) {
logger.debug( "Request " + r.toString() + " finished processing at " + timeOut );
}
long delta = timeOut.getTime() - timeIn.getTime();
if( delta > 300 ) { // todo: parameterize the delta threshold
logger.error( "Request " + r.toString() + " took " + delta + "ms to process." );
}
}
return InvocationResponse.CONTINUE;
}
}
その後、module.xml、axis2.xml を適宜編集し、*.mar ファイルを作成してアプリを実行しました。
しかし、どうやら
HttpServletRequest r = ( HttpServletRequest )msgContext.getProperty( HTTPConstants.MC_HTTP_SERVLETREQUEST )
無効です。それは予想外でした。
だから私の質問は:
- AXIS2 モジュールでサーブレット要求にアクセスするにはどうすればよいですか?
- これが許可されていない場合、リクエストの処理開始から処理終了までの時間を追跡する別の方法はありますか?
- 同じ種類の結果を得ることができる他の既存の AXIS2 機能を使用する必要がありますか?
前もって感謝します、Dave C.