JAX-WS with async servlets

So, I have this old legacy JAX-WS service, that does a lot of IO per request, so each request takes quite a bit of time, but doesn’t consume much CPU/RAM.

With amount of clients increasing lately, there’s a huge problem of thread starvation.

At first, I thought about implementing JAX-WS builtin async support, but it requires clients to be aware of it, and thats a no in my situation. I cannot possibly force them all to update their code.

My current idea is to create special async servlet and manually parse SOAP request and encode the response, but I can’t seem to find some good way to do that.

Is there any way to utilize Servlet 3.1 async support when handling JAX-WS requests?

I should clarify, that I cannot use some kind of queue, or otherwise “just return early”, because request processing can fail, and client must get that failure.

Answer

I’ve found the solution that works perfectly for me, CXF Continuations API.

http://cxf.apache.org/docs/continuations.html

https://github.com/search?l=java&q=ContinuationProvider&type=Code&utf8=%E2%9C%93

I had to enable async for CXF Servlet, and add jboss module dependency to bundled CXF.

While the whole things feels somewhat like a hack, it allowed me to do proper asynchronous processing without changing service external API at all.
As a bonus, I can even decide whether to suspend request, or process it normally, which helps a lot in certain cases.

Leave a Reply

Your email address will not be published. Required fields are marked *