Missing NonBlockingInterceptor on service wire
----------------------------------------------
Key: TUSCANY-1674
URL: https://issues.apache.org/jira/browse/TUSCANY-1674
Project: Tuscany
Issue Type: Bug
Reporter: Rashmi Hunt
The reason why NonBlockingInterceptor is needed on the service wire as well is,
if there is no nonBlockingInterceptor at service wire and if the service is
invoked not from a reference then there is no asynch support even if the call
is non blocking. For e.g if a pure webservice client (or any pure client) is
sending a request to a non blocking service call, since Tuscany code is
currently missing a nonBlockingInterceptor on the service wire, there is no
async support for this case, even though the service operation is marked as
non-blocking.
Solution is straightforward. Add NonBlockingInterCeptor on service wire in
RuntimeWireImpl.initInvocationChains() for the service wire clause
Binding serviceBinding = wireTarget.getBinding();
if (operation.isNonBlocking()) {
addNonBlockingInterceptor(service, serviceBinding, chain);
}
And add a new addNonBlockingInterceptor() function which takes params service,
serviceBinding, chain
/**
* Add a non-blocking interceptor if the service binding needs it
*
* @param service
* @param binding
* @param chain
*/
private void addNonBlockingInterceptor(ComponentService service, Binding
binding, InvocationChain chain) {
ServiceBindingProvider provider =
((RuntimeComponentService)service).getBindingProvider(binding);
if (provider != null) {
boolean supportsAsyncOneWayInvocation = false;
if (provider instanceof ServiceBindingProvider2) {
supportsAsyncOneWayInvocation =
((ServiceBindingProvider2)provider).supportsAsyncOneWayInvocation();
} else {
// Must be an old provider that doesn't have this method. If
this is a old provider keep the behavior
// as is where there is no nonBlockingInterceptor on the
service wire. If a binding provider needs a
// nonBlocking interceptor, it would have been implemented
ServiceBindingProvider2 and indicated
// supportsAsyncOneWayInvocation accordingly
supportsAsyncOneWayInvocation = true;
}
if (!supportsAsyncOneWayInvocation) {
chain.addInterceptor(new NonBlockingInterceptor(workScheduler));
}
}
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]