With EJBs we have made the bean developer all powerful. But who is the actual consumer of these beans, not the bean developer. It is the client calling the bean. I think we went the wrong way.
So I made a proposal to reverse this trend for @Asynchronous, see Asynchronous *Client* Invocation Semantics. On which Arjan Tijms came up with an interesting addition:
This interface can then be specified at the injection point:
@EJB @Asynchronous(ClientInterface.class) ClientInterface bean; // interface methods are asynchronous and proxy to actual proxy
Then I went on and filed for a change to allow setting the transaction timeout of a request.
David Blevins not only envisioned it in the same style as we have it currently on JBoss AS, but also brought back the point of having the client as a central focus:
Using your example, imagine how cool this would be:
@Stateless [edit: any managed bean] class FooBean { @EJB OtherBean other; @TransactionAttribute(NEVER) public void doSomething() { @TransactionTimeout(30) @TransactionAttribute(REQUIRED) other.doSomethingElse(); } } @Stateless class OtherBean { public void doSomethingElse() { assert currentTransactionTimeout() == 30; } }
Now musing on these on a Friday afternoon. It might actually be possible to realizable both without the need for JSR-308.
@Stateless class OtherBean { public void doSomethingElse() { assert currentTransactionTimeout() == 30; } } interface ClientInterface { @Asynchronous @TransactionTimeout(30) @TransactionAttribute(REQUIRED) Future<Void> doSomethingElse(); } Future<Void> result = ClientInvocationContext.invoke(bean).with(ClientInterface.class).doSomethingElse();
Albeit not as pretty as it would be with type annotations, it should make the customer rule again.