Adam Bien's Weblog
Fire And Forget. Without JMS. With EJB 3.1 and 8KB WAR File
JMS was often used just for asynchronous execution of synchronous methods. Now you can achieve the same with a single annotation: @Asynchronous. The following EJB 3.1 stores a JPA entity in an asynchronous way:
@Path("message")
@Stateless
public class MessagingService {
@PersistenceContext
EntityManager em;
@POST
@Asynchronous
public void newMessage(String content){
em.persist(new Message(content));
}
@Asynchronous
public Future<Long> create(String content){
Message message = new Message(content);
em.persist(message);
em.flush();
em.refresh(message);
return new AsyncResult<Long>(message.getId());
}
}
The method newMessage will be executed asynchronously, but still transactional, in the application servers thread pool. The method create returns Future, and can return so a result. It will either be executed in background thread or synchronous - if you invoke it too early. So it doesn't fit exactly to the Fire And Forget paradigm.
A deployable, working example (project Fire And Forget) was tested with Glassfish v3b70 and NetBeans 6.8beta and pushed into http://kenai.com/projects/javaee-patterns/. Btw. the whole WAR file (EJB 3.1 + REST) takes 8kB on the hard drive....
[See Lightweight Asynchronous Facade pattern, page 65 in "Real World Java EE Patterns Rethinking Best Practices" book for more in-depth discussion]
Posted at 11:51AM Nov 10, 2009 by Adam Bien in Real World Java EE Patterns - Rethinking Best Practices | Kommentare[0]
[my tweets]
Rss My book: Real World Java EE - Rethinking Best Practices

