@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]