Title: Tomcat JMS

Tomcat + Java EE = TomEE, the Java Enterprise Edition of Tomcat.  With TomEE you get Tomcat with JMS added and integrated and ready to go!

In a plain Servlet, Filter or Listener you can do fun things like injection of JMS Topics or Queues:

    import javax.annotation.Resource;
    import javax.servlet.http.HttpServlet;
    import javax.jms.Topic;
    import javax.jms.Queue;
    import javax.jms.ConnectionFactory;

    public class MyServet extends HttpServlet {

        @Resource(name = "foo")
        private Topic fooTopic;

        @Resource(name = "bar")
        private Queue barQueue;

        @Resource
        private ConnectionFactory connectionFactory;

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //...

            Connection connection = connectionFactory.createConnection();
            connection.start();

            // Create a Session
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            // Create a MessageProducer from the Session to the Topic or Queue
            MessageProducer producer = session.createProducer(fooTopic);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

            // Create a message
            TextMessage message = session.createTextMessage("Hello World!");

            // Tell the producer to send the message
            producer.send(message);

            //...
        }

    }

No need to add even a single library!  In the above scenario even the "foo" Topic and the "bar" Queue would be automatically created with no configuration necessary.

[Download](downloads.html) TomEE and you're minutes away from a functioning JMS application on Tomcat.

{include:apache-tomee.mdtext}