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]

Reply via email to