users@glassfish.java.net

JMS Vodoo

From: <glassfish_at_javadesktop.org>
Date: Mon, 11 Aug 2008 18:24:12 PDT

I am currently experiencing a problem with using JMS. I am not sure if this is directly related to GlassFish or not. I have 2 Message Driven Beans, each reside in different Enterprise Application Deployments. When sending a message to my first MDB it appears in my log that the second MDB reads the message. Here is the configuration files and code.

1st Applications sun-resource.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <admin-object-resource enabled="true" jndi-name="jms/MTester" object-type="user" res-adapter="jmsra" res-type="javax.jms.Queue">
    <description/>
    <property name="Name" value="PhysicalQueue"/>
  </admin-object-resource>
  <connector-resource enabled="true" jndi-name="jms/MTesterFactory" object-type="user" pool-name="jms/MTesterFactoryPool">
    <description/>
  </connector-resource>
  <connector-connection-pool associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-definition-name="javax.jms.QueueConnectionFactory" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="true" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="jms/MTesterFactoryPool" pool-resize-quantity="2" resource-adapter-name="jmsra" steady-pool-size="8" validate-atmost-once-period-in-seconds="0"/>
</resources>

1st Applications sun-ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar>
  <enterprise-beans>
    <ejb>
      <ejb-name>MTesterSessionBean</ejb-name>
      <resource-ref>
        <res-ref-name>jms/MTesterFactory</res-ref-name>
        <jndi-name>jms/MTesterFactory</jndi-name>
      </resource-ref>
      <message-destination-ref>
        <message-destination-ref-name>jms/MTester</message-destination-ref-name>
        <jndi-name>jms/MTester</jndi-name>
      </message-destination-ref>
    </ejb>
  </enterprise-beans>
</sun-ejb-jar>

1st MDB Code
package com.mdb.test;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

@MessageDriven(mappedName = "jms/MTester", activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class MTesterBean implements MessageListener {
    
    public MTesterBean() {
    }

    public void onMessage(Message message) {
        if(message instanceof TextMessage) {
            
            try {
                TextMessage tm = (TextMessage) message;
                System.out.println(tm.getText());
            }
            catch (JMSException jMSException) {
            }
        }
    }
    
}

2nd Applications sun-resource.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
  <jdbc-resource enabled="true" jndi-name="beltmasta" object-type="user" pool-name="post-gre-sqlPool"/>
  <admin-object-resource enabled="true" jndi-name="jms/SalesOrderSubmitLogger" object-type="user" res-adapter="jmsra" res-type="javax.jms.Queue">
    <description/>
    <property name="Name" value="PhysicalQueue"/>
  </admin-object-resource>
  <connector-resource enabled="true" jndi-name="jms/SalesOrderSubmitLoggerFactory" object-type="user" pool-name="jms/SalesOrderSubmitLoggerFactoryPool">
    <description/>
  </connector-resource>
  <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="org.postgresql.ds.PGSimpleDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="200" max-wait-time-in-millis="60000" name="post-gre-sqlPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="56" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
    <property name="databaseName" value="beltmasta3"/>
    <property name="serverName" value="**.**.**.**"/>
    <property name="portNumber" value="5432"/>
    <property name="User" value="postgres"/>
    <property name="Password" value="****"/>
    <property name="URL" value="jdbc:postgresql://**.**.**.**:5432/beltmasta3"/>
    <property name="driverClass" value="org.postgresql.Driver"/>
  </jdbc-connection-pool>
  <connector-connection-pool associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-definition-name="javax.jms.QueueConnectionFactory" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="true" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="jms/SalesOrderSubmitLoggerFactoryPool" pool-resize-quantity="2" resource-adapter-name="jmsra" steady-pool-size="8" validate-atmost-once-period-in-seconds="0"/>
</resources>

2nd Applications sun-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar>
  <enterprise-beans>
    <ejb>
      <ejb-name>InvoiceFactoryBean</ejb-name>
      <resource-ref>
        <res-ref-name>jms/CostUpdaterFactory</res-ref-name>
        <jndi-name>jms/CostUpdaterFactory</jndi-name>
      </resource-ref>
      <message-destination-ref>
        <message-destination-ref-name>jms/SalesOrderSubmitLogger</message-destination-ref-name>
        <jndi-name>jms/SalesOrderSubmitLogger</jndi-name>
      </message-destination-ref>
    </ejb>
  </enterprise-beans>
</sun-ejb-jar>

2nd Applications MDB Code
package beltmasta.ejb.message;

import beltmasta.ejb.persistance.LogRecord;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@MessageDriven(mappedName = "jms/SalesOrderSubmitLogger", activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class SaleOrderSubmitLoggerBean implements MessageListener {
    @PersistenceContext
    private EntityManager em;
    
    public SaleOrderSubmitLoggerBean() {
    }

    public void onMessage(Message message) {
        System.out.println("SalesOrderSubmitLoggerBean->onMessage(Message): Message Received");
        if(message instanceof ObjectMessage) {
            try {
                ObjectMessage omsg = (ObjectMessage) message;
                Object object = omsg.getObject();
                if(object instanceof LogRecord) {
                    LogRecord lr = (LogRecord)object;
                    System.out.println("SalesOrderSubmitLoggerBean->onMessage(Message): Persisting Log Record");
                    em.persist(lr);
                }
            } catch (JMSException ex) {
                Logger.getLogger(SaleOrderSubmitLoggerBean.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
    }

    public void persist(Object object) {
        em.persist(object);
    }
    
}

Any help on this matter would be very appreciated.
[Message sent by forum member 'ddurst' (ddurst)]

http://forums.java.net/jive/thread.jspa?messageID=292737