On Jan 20, 2014, at 10:39 AM, Andrei Shakirin <[email protected]> wrote:

> Hi Christian and Dan,
> 
> Thanks for your comments.
> 
> I will start to implement my use case on the base of decoupled WS-Addressing 
> and OneWay's and illustrate that with a blog and example.
> Would like to evaluate the enhancement of using the @UseAsyncMethod with 
> decoupled WS-Addressing.
> 
> @Dan: 
> Regarding @UseAsyncMethod and Provider<T>: I am a bit confused with that, 
> because normally interface have to provide either Future<?> as return type or 
> AsyncHandler as argument to return response in other thread. How service 
> implementing Provider<T> could look like with asynchronous style?

Should be just like in the generated case, but you need to create the extra 
method yourself:


public class MyProvider implements Provider<Source> {

    @UseAsyncMethod
    public Source invoke(Source s) {
        … if continuations aren’t supported …..
    }

    public Future<?> invoke(Source s, final AsyncHandler<Source> asyncHandler) {
        final ServerAsyncResponse<Source> r = new ServerAsyncResponse<Source>();
            new Thread() {
                public void run() {
                    Source s = … create the response source ….
                    asyncHandler.handleResponse(r);                    
                }
            } .start();
            return r;
    }
}

That said, I don’t think we have a test for this.   The theory is that it 
should work.  :-)    If it doesn’t work, it’s a bug that we should get fixed.

Dan



> 
> Regards,
> Andrei.
> 
>> -----Original Message-----
>> From: Daniel Kulp [mailto:[email protected]]
>> Sent: Montag, 20. Januar 2014 14:34
>> To: [email protected]; Andrei Shakirin
>> Subject: Re: SOAP async communication in CXF
>> 
>> 
>> On Jan 17, 2014, at 11:22 AM, Andrei Shakirin <[email protected]> wrote:
>>> I have some requirements regarding async communication for SOAP (the
>> topic is related to http://cxf.547215.n5.nabble.com/Suggestion-regarding-
>> link-between-two-portTypes-and-operations-in-WSDL-td5738657.html , but
>> reformulated):
>>> 
>>> 1. Service can process requests for a long time, for example some days
>>> 2. Communication should be possible even with HTTP protocol, not only
>>> with JMS 3. Communication must be tolerant to server restart => call
>>> context have to be persisted
>>> 
>>> On the client side JAX-WS provides async methods for generated clients
>> (via Future<> and AsyncHandler<>) and for generic Dispatch interface
>> (invokeAsync()).
>>> On the server side JAX-WS doesn't define async API, but CXF provides
>>> @UseAsyncMethod annotation
>>> (http://cxf.apache.org/docs/annotations.html#Annotations-org.apache.cx
>>> f.annotations.UseAsyncMethod%28since2.6.0%29 )
>>> 
>>> However currently I see some limitations of async communication:
>>> 1. CXF doesn't provide async API for the generic, not generated services
>> (Provider<T>). As a sample we can refer to Metro/RI implementation:
>> https://jax-ws.java.net/nonav/jax-ws-20-
>> fcs/arch/com/sun/xml/ws/api/server/AsyncProvider.html .
>> 
>> The UseAsyncMethod annotation thing that we use for the generated stuff
>> SHOULD also work for Provider based services.   If not, it's a bug.
>> 
>> 
>>> 2. @UseAsyncMethod will be activated only if transport supports
>> asynchronous communication.
>> 
>> It likely should also be activated for decoupled WS-Addressing cases and
>> OneWay's.   That's certainly a good enhancement request.
>> 
>>> 3. There is no concept to persist/restore call context on the service side.
>>> 
>>> The question is: are these requirements interesting for the community?
>> Does it make sense to extend CXF to support such scenarios?
>>> As possible features can be the following:
>>> 1. Provide AsyncProvider like API for generic service implementations
>> 
>> See above.
>> 
>>> 2. Simulate async communication via two oneWay operations: one on client
>> and one on service side. This could help to avoid dependency on transport.
>>> 3. Provide extension point to persist call context to make possible finish 
>>> the
>> request processing even after service restart.
>> 
>> THIS would be super hard.  Much of the stuff in the context and messages is
>> not Serializable.   I'm really not sure how much could be persisted and
>> recovered reliably.   Being generic maps, interceptors and such can add
>> pretty much anything to them which could easily break this.
>> 
>> Client side is even more complex.  In the decoupled cases, the decoupled
>> endpoint isn't started until the the first request that needs it is sent.  
>> Thus, if
>> the client restarts, it wouldn't startup.  Thus, we'd need to change that
>> somehow.  Bunch of other issues related to callbacks that might no longer be
>> valid and such as well.
>> 
>> Honestly, if this is to be modeled as two one-ways, the best option is to 
>> really
>> model it as two one ways and pass and EndpointReferenceType as a
>> parameter. (or header)   By actually modeling it as one ways, there  is a lot
>> less needed from a correlation standpoint (and any correlation would be
>> done at the application layer).   This should also maintain general
>> interoperability and work with other clients such as .NET or Metro.
>> 
>> 
>> --
>> Daniel Kulp
>> [email protected] - http://dankulp.com/blog Talend Community Coder -
>> http://coders.talend.com
> 

-- 
Daniel Kulp
[email protected] - http://dankulp.com/blog
Talend Community Coder - http://coders.talend.com

Reply via email to