"pete.muir(a)jboss.org" wrote : "cpopetz" wrote : where anAsyncMethod()
is a method marked @Aysnchronous. (I'd mark the observer itself as @Asynchronous, but
that gets ignored.)
|
| There is an open feature request for this to be supported (I think it makes good
sense).
|
Wonderful, thanks.
"pete.muir(a)jboss.org" wrote : "cpopetz" wrote : However,
anAsyncMethod() isn't called asynchronously, because TransactionCompletionEvent is an
AsynchronousEvent, and seam disallows spawning one asynchronous call from another.
|
| This was a bug which we fixed for 2.0.0.GA - what version are you using?
|
| You certainly should be able to schedule async calls from other async calls.
|
Indeed, and the above example is working for me since moving to 2.0.0GA. I now have a
similar situation that's a little more complicated than above. My @Observer and the
@Asynchronous method it invokes are in the same SLSB. (And once @Observers can be
@Asynchronous, this will all be moot, because that's what I'm working around.) I
had done the following from within the @Observer method:
| @Observer("doLongWorkAfterTxIsDone")
| public void doWork() {
| // this.anAsynchMethod(); //doesn't work; no interceptors
| ejbContext.getBusinessObject(AttachmentStorer.class).anAsynchMethod();
| }
|
| //this is annotated @Asynchronous in the @Local interface
| public void anAsynchMethod() {
| ...
| }
|
But this causes seam to use the SERVER set of interceptors, which does not include
AsynchronousInterceptor. I also tried doing
Component.getInstance("myComponentName") to obtain an intercepted version of
"this", but the method context contains "this" and just returns it,
and no interceptors are used on the invocation of anAsynchMethod() in that case either.
It seems that @Asynchronous works well between objects, but not so well for method calls
within an object, which is unfortunate, but perhaps that's by design. I can refactor
to move the asynchronous code into a different bean, but that's a bit artificial. So
I'll probably just use Seam's Work() { } construct.
This is similar to the problem I faced with @TransactionAttribute and intra-bean calls. I
think it's a common use-case for a session bean to want to invoke methods upon itself,
but in order to have CMT work correctly in the non-default case of having an outer method
be non-transactional and repeatedly invoke an inner method which gets its own transaction,
this means using getBusinessObject(), which is just plain ugly.
But that's not seam's issue :)
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4115547#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...