5 Replies Latest reply on Aug 11, 2005 11:46 AM by clebert.suconic

    Transaction isolation problem!

    clebert.suconic

      I'm having an issue that I don't know if it's a bug or a JMS configuration problem.

      I have a testcase which is calling a Statefull Session Bean.
      Them I'm sending a JMS message, supposelly using XA. Here is the code for the lookup in the Stateless Session Bean, Bean Managed Transaction:

       public void setSessionContext(SessionContext sessionContext) {
      
       this.sessionContext = sessionContext;
      
       try {
       // the homes are available via EJB links
       Context context = new InitialContext();
       queueConnFactory = (QueueConnectionFactory) context.lookup("java:/JmsXA");
       queue = (Queue) context.lookup("queue/TestQueue");
       System.out.println("queue = " + queue.toString());
       } catch( NamingException e ) {
       throw new EJBException("Failure looking up home" + e);
       }
      
      
       }
      



      The method which is sending the message:

       public void testSend(String strmessage) {
      
       String itemId = null;
       QueueConnection queueConn = null;
       QueueSession queueSess = null;
      
      
       //Check for large orders
       try {
       UserTransaction trans = sessionContext.getUserTransaction();
       trans.begin();
       int originalValue = MDBSimpleListener.count;
       queueConn = queueConnFactory.createQueueConnection();
       queueSess = queueConn.createQueueSession(true, 0);
       QueueSender queueSender = queueSess.createSender(queue);
       TextMessage message;
      
       try{
       message = queueSess.createTextMessage();
       message.setText(strmessage);
       System.out.println("message was sent" + message);
       queueSender.send(message);
      
       Thread.sleep(1000);
      
       if (originalValue!=MDBSimpleListener.count)
       {
       throw new RuntimeException("Value changed");
       }
      
       trans.commit();
      
      
       Thread.sleep(1000);
      
       if (originalValue==MDBSimpleListener.count)
       {
       throw new RuntimeException("Value not changed");
       }
      
       }
       finally {
       if( queueConn != null ) queueConn.close();
       if( queueSess != null ) queueSess.close();
       }
       }
       catch (Exception e) {
       e.printStackTrace();
       throw new RuntimeException (e);
       }
       }
      


      The only thing done at the MDB (MDBSimpleListener) is to increment a static value, and the value is being changed before the commit of the transaction. In other words I'm getting the first runtime exception (Value changed).


      So, if someone think this a bug it would be easy to add this testcase to the testsuite.

      If this is a configuration issue, any idea in what is wrong?

      I'm having an issue with Specj, where a MDB is getting a message before the caller releases the rows which is causing some deadlocks. That's why I have extracted this testcase.


      Clebert Suconic