CC-ing to the users
On 14/02/14 13:05, Sergey Beryozkin wrote:
Hi Bhupesh
On 14/02/14 08:55, [email protected] wrote:
Hi Sergey,

Here is my what I am trying to do and you can tell me if it makes
sense or not as I am new to this NIO concept.

I have implemented a REST service running on Tomcat (7.0.23) and Jetty
(6.1.10) using JAXRS, servlet-api 2.5, CXF 2.7.7 and camel 2.10.0. My
service is an orchestrator that is mostly IO bound and talks to many
REST services. My requirement is to scale my service to the extreme
level and get milliseconds SLA.

After reading about NIO and async support in servlet 3.0, I thought of
two things that can probably benefit my service.
1. When the request thread takes control of handling the request, it
calls camel route that uses multicast pattern. I will execute the
camel route in async thread and return the request thread to the
thread pool so that it can handle other waiting requests.

2. During I/O with other services, I want to read the responses in a
non-blocking way.

Given your experience with NIO and async processing, can you tell if I
am marching in the right direction?

I've no specific NIO experience, hope it won;t disappoint you too much
:-), well, I did write some NIO awhile back, mostly related to the File
processing which is rather orthogonal to processing IO requests.

But I believe that for you to get the most of it and of async support in
particular *in CXF* you should have your resource methods immediately
delegate to the executor for the container to immediately reuse the
transport thread while the service does some work, and then when it's
done, resume AsyncResponse

Thanks, Sergey

Thanks,
Bhupesh

<quote author='Sergey Beryozkin'>
One other comment, right now, given the way you wrote the code, no any
specific improvement will be achieved

The JAX-RS runtime actually suspends the invocation immediately after
the async method returns, so if you effectively block and resume
immediately then it won't make a difference.

So try to do it the way is is documented or shown in the tests where you
delegate the execution to a thread pool, and then resume async response
when it is actually ready.

I'm not sure it makes sense to suspend before the method is entered by
the current transport thread, the container won't free it before it
returns from the method anyway...

I can only imagine it being effective if we combine it with the custom
executors (can be configured on jaxrs/jaxws endpoints), where the
invoking thread blocks when delegating to the custom executor, and where
somehow this blocking thread is released when the continuation is
suspended before the method is invoked, without awaiting for the return
of the executor thread. This seems a bit hairy but might be worth
exploring

Cheers, Sergey



On 13/02/14 10:08, Sergey Beryozkin wrote:
Hi, I guess you have not enabled the async support at the servlet level


Cheers, Sergey
On 13/02/14 09:37, Bhupesh Tuteja wrote:
Hi Sergey,

I tried this and getting following exception. It cannot get the
continuation
provider.

ERROR:2014-02-13 01:27:06.420:btpool0-0:"Exception handled at
ExceptionMapperProvider:
null":java.lang.NullPointerException:null:java.lang.NullPointerException

     at
org.apache.cxf.jaxrs.impl.AsyncResponseImpl.initContinuation(AsyncResponseImpl.java:240)


     at
org.apache.cxf.jaxrs.impl.AsyncResponseImpl.<init>(AsyncResponseImpl.java:58)


     at
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:767)


     at
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:741)


     at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:263)


     at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:103)


     at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)


     at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)


     at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)


     at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)


     at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)


     at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)


     at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)


     at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)


     at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)


     at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
     at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)


     at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
     at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)

     at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)


     at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)

     at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)

     at
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
     at
org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)


     at
org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)


     at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)

     at org.mortbay.jetty.Server.handle(Server.java:324)
     at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
     at
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)


     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:648)
     at
org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
     at
org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
     at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)


     at
org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)




My code snippet looks like this.

public void postSomething(final AsyncResponse async) {

         async.setTimeout(1, TimeUnit.MILLISECONDS);
         async.setTimeoutHandler(new TimeoutHandler() {

             @Override
             public void handleTimeout(AsyncResponse asyncResponse) {

                                          //I have put my service impl
code
here

                                         Collection<XYZ> response = get
response();
                        async.resume(response);
                 }

             }
         });
     }





--
View this message in context:
http://cxf.547215.n5.nabble.com/Server-Side-Asynchronous-processing-support-via-CXF-NIO-support-tp5739791p5739911.html


Sent from the cxf-user mailing list archive at Nabble.com.







--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Reply via email to