You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Adar Dembo <ad...@cloudera.com> on 2013/04/24 23:00:44 UTC

JAX-RS recursive dispatch?

My application uses JAX-RS to build its external API. I think the
implementation is as you'd expect: requests are dispatched to the
appropriate resource, based on the @Path, @GET, @POST, @DELETE, etc.
annotations.

I'm trying to build a "batch" endpoint for this API. The idea is that the
endpoint would have a single resource, which, when it gets a POST, would
create a new database transaction, dispatch to a number of other endpoints,
and commit the transaction. Any dispatch failures would roll back the
transaction. The body of the POST would contain information on what to
dispatch (i.e. it'd be a list where each item is an HTTP method, a URL, and
a body).

My problem: how do I redispatch from inside my batch endpoint? I'd like to
call into CXF for each batch list item, otherwise I have to do all the
argument marshaling myself. Put another way, I want to give CXF an HTTP
method, a URL, and a body, and have it call the appropriate resource in the
appropriate way for me. How do I do that?

Re: JAX-RS recursive dispatch?

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
On 24/04/13 22:00, Adar Dembo wrote:
> My application uses JAX-RS to build its external API. I think the
> implementation is as you'd expect: requests are dispatched to the
> appropriate resource, based on the @Path, @GET, @POST, @DELETE, etc.
> annotations.
>
> I'm trying to build a "batch" endpoint for this API. The idea is that the
> endpoint would have a single resource, which, when it gets a POST, would
> create a new database transaction, dispatch to a number of other endpoints,
> and commit the transaction. Any dispatch failures would roll back the
> transaction. The body of the POST would contain information on what to
> dispatch (i.e. it'd be a list where each item is an HTTP method, a URL, and
> a body).
>
> My problem: how do I redispatch from inside my batch endpoint? I'd like to
> call into CXF for each batch list item, otherwise I have to do all the
> argument marshaling myself. Put another way, I want to give CXF an HTTP
> method, a URL, and a body, and have it call the appropriate resource in the
> appropriate way for me. How do I do that?
>
I think you can inject a single CXF WebClient instance [1] into the 
endpoint's root resource, with a 'threadSafe' flag set to 'true' and 
some base path set too, and then adjust it use one of its generic 
invoke() methods. This should be the most effective option as the actual 
client instance will be set up/initialized only once, though at the cost 
of having a thread-local map utilized on the client side.

Or you can try creating clients dynamically, example:

JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
bean.setAddress(address);
WebClient wc = bean.createWebClient();
Response r = wc.post(body);
TransactionItem item = r.readEntity(TransactionItem.class);
...

HTH, Sergey

[1] 
https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Client+API#JAX-RSClientAPI-ConfiguringHTTPclientsinSpring
[2] 
https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Client+API#JAX-RSClientAPI-ThreadSafety