If you are only concerned with http requests, an alternative would be to
implement a servlet Filter[1].
Here is a very basic outline of what it could look like:
public class PerformanceFilter implements javax.servlet.Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
final long start = System.currentTimeMillis();
try {
chain.doFilter(request, response);
} finally {
final long elapsed = System.currentTimeMillis() - start;
if (elapsed > threshold) {
logger.error((HttpServletRequest)request.getRequestURI() + " from " +
request.getRemoteAddr() + " took " + elapsed + "ms");
}
}
}
}
[1] - http://docs.oracle.com/javaee/5/api/javax/servlet/Filter.html
Brett Okken | CAMM Platform Services | Lead Architect | 816.201.6112 |
www.cerner.com | [email protected]
-----Original Message-----
From: Dave Cherkassky [mailto:[email protected]]
Sent: Tuesday, April 30, 2013 9:08 AM
To: [email protected]
Subject: Accessing an HttpServletRequest from inside an AXIS2 module
I am implementing AXIS2 services in my web application. Our client's
production boxes are a bit flaky, so I want a heads up when performance
degraded. Specifically:
- request comes into my AXIS2 service
- measure the time that the request takes
- if the time is greater than X, log an error
So I wrote an AXIS2 module like this:
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;
}
}
After that, I edited the module.xml, axis2.xml appropriately, created the *.mar
file and ran the app.
However, it seems that
HttpServletRequest r = ( HttpServletRequest
)msgContext.getProperty( HTTPConstants.MC_HTTP_SERVLETREQUEST )
is null. That was unexpected.
So my questions are:
- How can I access the servlet request in an AXIS2 module?
- If this is not allowed, what's the alternative for me to track the
time between request starting processing and ending processing?
- I should be using some other existing AXIS2 functionality that can
give me the same kind of result?
Many thanks in advance,
--
Dave Cherkassky
DJiNN Software Inc
VP of Software Development
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
CONFIDENTIALITY NOTICE This message and any included attachments are from
Cerner Corporation and are intended only for the addressee. The information
contained in this message is confidential and may constitute inside or
non-public information under international, federal, or state securities laws.
Unauthorized forwarding, printing, copying, distribution, or use of such
information is strictly prohibited and may be unlawful. If you are not the
addressee, please promptly delete this message and notify the sender of the
delivery error by e-mail or you may call Cerner's corporate offices in Kansas
City, Missouri, U.S.A at (+1) (816)221-1024.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]