Adam Bien's Weblog

Tuesday Nov 10, 2009

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] 


[my tweets]  Rss My book: Real World Java EE - Rethinking Best Practices

Kommentare:

Senden Sie einen Kommentar:
  • HTML Syntax: Ausgeschaltet
Interviews/About
My Recent Book
Java One 2009
CommunityOne East N.Y.C
JavaONE 2008 Interview
Search
...the last 150 posts
...the last 10 comments
greenfire.dev.java.net
Links
my.netbeans.org
Visitors
License