[jbossws-dev] Fwd: EndpointMetrics Refactor
Jim Ma
ema at redhat.com
Wed Jul 9 06:16:20 EDT 2014
Hi Alessio,
Thanks for the review! Please see my comments inline.
On 08/07/14 18:45, Alessio Soldano wrote:
> ResponseTime(*)Interceptor
> --------------------------------------
> * The AbstractResponseTimeInterceptor#getServiceCounterName method
> will be using the counter name we set in the
> EndpointAssociationInterceptor, good. However, from a CXF point of
> view, the name could be computed each time, so the code doing that
> needs to be decently optimized. In particular, the StringBuilder
> should be properly used there; if there's a StringBuilder being used,
> you should really avoid string concatenations to add stuff in the
> builder. The JDK optimizer will replace the string concatenations with
> additional StringBuilder instances, which is a waste of resources. So
> basically use multiple append() invocations instead of String
> concatenations (unless the String constants only are being concatenated).
These are all legacy codes from cxf, and another 5 StringBuilder
instance will be created for the string concatenations. But it is more
readable than all with append(). Should we pay the additional resources
to get readability?
> * same reasoning for
> AbstractResponseTimeInterceptor#getOperationCounterName, plus please
> use StringBuilder instead of StringBuffer, as that's not accessed
> concurrently.
I wrote this wrong. It's a local variable and doesn't have some
concurrent issue,so StringBuilder will be fine, no need StringBuff.
> * In all ResponseTimeMessage(*)Interceptor, the check on
> "forceDisabled" should come before the isServiceCounterEnabled()
> invocation, as that's expensive. So basically do "if !forceDisabled &&
> (isServiceCounterEnabled(ex))" instead of "if
> (isServiceCounterEnabled(ex) && !forceDisabled)"
I'll make this change.
>
> ResponseTimeCounter
> -------------------------------
> * Generally speaking I have some concerns on the thread safety of this
> class, in particular on visibility. Shouldn't we have final or
> volatile attributes?
Looked at this class again. The totalHandlingTime, minHandlingTime
and maxHandlingTime should be all atomic variable.
> * At line 87, did you really want to use "|" or "||" ?
typo !
> * Is it possible to end up with handlingTime = 0 for oneway messages
> and hence end up setting min handling time to 0 ? Is that reasonable ?
> (probably no...)
no. The oneway message will go into several interceptors and consume
some time to finish the process.
> * the update of min and max handling time in not performed in a thread
> safe way; please have a look at how that should possible be done in
> our former EndpointMetricImpl (see updateMin / updateMax in [1])
It should be all atomic variable here.
> * it is possible to get unreliable values for the average response
> time in highly concurrent environments; we might decide to accept this
> or solve as we did in our EndpointMetricsImpl (see the usage or
> read/write lock and related comment in [1])
I am not sure if the lock is a bit heavy here. It is possible to
affect the interceptor execution performance , and it will wait the
lock, then the last interceptor MessageSenderEndingInterceptor can
really send the response to the client.Do you
think compareAndSet() can help solve this problem ?
>
> EndpointAssociationInterceptor
> -------------------------------------------
> * We should probably set the service counter name in the exchange only
> when the statistics are enabled.
I'll refactor this.
>
> EndpointMetricsCXFAdapterImpl
> --------------------------------------------
> * counterRepo and counter members should be final, while there's no
> need for keeping a reference to the objectName
Make it as method local final variable will be better.
Cheers,
Jim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jbossws-dev/attachments/20140709/40cd5cbe/attachment.html
More information about the jbossws-dev
mailing list