Re: How do i handle long-running background tasks in J2EE?
On Wed, 15 Sep 2010, Arne Vajh?j wrote:
On 15-09-2010 13:36, Tom Anderson wrote:
As it happens, we know we can do this by spawning a thread. I know that
the J2EE spec contains dire injunctions against doing that, and that
it's not portable, but on our platform, it happens that it works.
Creating threads are fully supported in Java EE - it is explicit
forbidden in EJB and a bad idea in servlet but it is a core feature of
Good point, sorry, i was imprecise. I'm not entirely sure what context my
code is running in; it probably counts as a vastly overgrown servlet. I'm
pretty sure it's not a resource adapter.
I suppose one option would be to *write* a resource adapter which is
basically just an Executor, and use that. That would be a modest misuse of
JCA, but hey.
The one thing i've come up with is using JMS. We could set up a queue,
have the request threads post orders onto it, then use a message-driven
bean to pull them off and deal with them. I have no idea how we'd make
that multithreaded, nor how we'd communicate completion back to the
That said then in this context I think the message queue (via JMS) and a
MDB is a much better solution. The first servlet/Strust Action/ JSF
Backing Bean/whatever puts the request in one queue, the MDB processes
and put the response in the other queue, the second whatever simply
checks if the response are in the queue using message selector.
Aha - message selectors. That'd how we'd handle the responses. I'd
forgotten about those. That was one of my key points of puzzlement. And
MDBs can be configured to have multiple instances, which delivers the
So, with JMS/MDB, how do i pass objects from the front end to the back? Do
i have to serialise them into the message? Or can i keep them in some sort
of global map, and just send an ID? I assume either will work; are there
any well-known considerations about the choice? In my case, i'd like the
outcome of the process to include modifications to a mutable object (the
Order), which points to the shared object approach being better. Or can i
pass whole objects somehow?
Destroy! DESTROY! DEEEEEEE-STROY 2000 YEARS OF CULTCHAH!! -- Andrew