/** * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.example.jms.mdbfailure; import java.util.HashSet; import java.util.Set; import javax.ejb.EJBException; import javax.ejb.MessageDrivenBean; import javax.ejb.MessageDrivenContext; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.InitialContext; /** * @author <a href="mailto:ovidiu@feodorov.com">Ovidiu Feodorov</a> * @version <tt>$Revision: 85945 $</tt> * $Id: MDBFailureExample.java 85945 2009-03-16 19:45:12Z dimitris@jboss.org $ */ public class MDBFailureExample implements MessageDrivenBean, MessageListener { private MessageDrivenContext ctx; private ConnectionFactory cf = null; private static Set messageIDs = new HashSet(); public void onMessage(Message m) { Session session = null; Connection conn = null; try { TextMessage tm = (TextMessage)m; String text = tm.getText(); System.out.println("message " + text + " received"); System.out.println("message " + (tm.getJMSRedelivered() ? "" : "NOT ")+ "marked as \"redelivered\""); // if it is the first time any of the MDB instances from the pool sees the message, the // message will cause the MDB instance to "crash" synchronized(messageIDs) { if (!messageIDs.contains(tm.getJMSMessageID())) { messageIDs.add(m.getJMSMessageID()); System.out.println("The message has \"broken\" our MDB ..."); // "crashing" the MDB. The exception won't be caught by our catch clause and it will // bubble up throw new RuntimeException("Unfortunate events happen ..."); } else { System.out.println("The message is already \"known\", so let it be processed"); } } String result = process(text); System.out.println("message processed, result: " + result); conn = getConnection(); session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination replyTo = m.getJMSReplyTo(); MessageProducer producer = session.createProducer(replyTo); TextMessage reply = session.createTextMessage(result); producer.send(reply); producer.close(); } catch(JMSException e) { ctx.setRollbackOnly(); e.printStackTrace(); System.out.println("The Message Driven Bean failed!"); } finally { if (conn != null) { try { closeConnection(conn); } catch(Exception e) { System.out.println("Could not close the connection!" +e); } } } } private String process(String text) { // flip the string String result = ""; for(int i = 0; i < text.length(); i++) { result = text.charAt(i) + result; } return result; } public Connection getConnection() throws JMSException { Connection connection = null; try { connection = cf.createConnection(); connection.start(); } catch(JMSException e) { if(connection != null) { closeConnection(connection); } System.out.println("Failed to get connection... exception is " + e); throw e; } return connection; } public void closeConnection(Connection con) throws JMSException { try { con.close(); } catch(JMSException jmse) { System.out.println("Could not close connection " + con +" exception was " +jmse); throw jmse; } } public void ejbCreate() { try { InitialContext ic = new InitialContext(); cf = (ConnectionFactory)ic.lookup("java:/JmsXA"); ic.close(); } catch(Exception e) { e.printStackTrace(); throw new EJBException("Failure to get connection factory: " + e.getMessage()); } } public void ejbRemove() throws EJBException { try { if(cf != null) { cf = null; } } catch(Exception e) { throw new EJBException("ejbRemove", e); } } public void setMessageDrivenContext(MessageDrivenContext ctx) { this.ctx = ctx; } }