Hi community, After more reading, trial and error and thinking I managed to get this setup working. I thought I would share my efforts, in case anyone would like to make use of it.
*Set up some test resources on the ActiveMQ server* Create a topic on Activemq called jms/activemq/topic. Next, create a durable subscriber (clientId = clientID, subscriptionName = subscriberId. for illustration, the broker is located at tcp://2.2.2.2:61616. *Configure the activemq-rar-5.5.1.rar file* I found it best to edit the ra.xml in the activemq-rar-5.5.1.rar in order to set correct properties. This meant: 1) Setting the serverUrl property to the location of the remote message broker (tcp://2.2.2.2:61616) 2) Removing the the config property relating to the embedded broker usecase (as noted by in-file comments) *Copy ActiveMQ libs to Glassfish* Next, copy the following libraries: log4j-1.2.14.jar slf4j-api-1.5.11.jar slf4j-log4j12-1.5.11.jar from the activemq distro/libs directory to the <glassfishInstall>/<domain>/lib directory Deploy the activemq-rar-5.5.1.rar via the Glassfih admin console (Application > Deploy) *Configure Glassfish resource adapter & connection resources* I used the admin console to: 1) Create a new resource adapter via Resource Adapter Configs menu 2) Create a new ConnectionPool for the activemq-rar-5.5.1 resource adapter 3) Create a new Connector resource from the activemq ConnectionPool (e.g. jms/activemq/connector for jndi name) 4) Create a new admin object, corresponding to the jms destination on the remote activemq broker (in our case jms/activemq/topic). Make sure you select the activemq resource adapter from the drop down list, and set a physical name. *Build an MDB project* I used Netbeans (7.0.1) to create a new EAR application, and within it a EJB module. Within the EJB module, I created a new MDB, within a mq.beans package. The MDB code simply writes out the content of a textmessage to the standard output (the Glassfish server log). See code below. Note the annotations, which provide clientId and subsriptionName values which correspond to the durable subscriber details we created in ActiveMQ, and that the mdb is mapped to the Glassfish admin object jms/activemq/topic, which is mapped to the activeMq topic by the jndi name. Source code for simple MDB: ****MqTopicMdb.java*** package mq.beans; import java.io.File; import java.io.FileWriter; import java.io.IOException; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; /** * * @author Ant */ @MessageDriven(mappedName = "jms/activemq/topic", activationConfig = { @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"), @ActivationConfigProperty(propertyName = "clientId", propertyValue = "clientID"), @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "subscriberID") }) public class MqTopicMdb implements MessageListener { public MqTopicMdb() { } private int count = 0; @Override public void onMessage(Message message) { try { count = count + 1; File msgFile = new File("C:\\someUser\\Desktop\\activeMQ msgs\\activeMqMessage" + count + ".txt"); FileWriter writer = new FileWriter(msgFile); // get a textMessage if (message instanceof TextMessage) { TextMessage txtMsg = (TextMessage) message; System.out.println("Received text message " + count + " from activeMQ:\n" + txtMsg.getText()); writer.write("Message " + count + ":\n" + txtMsg.getText()); writer.close(); } else { System.out.println("Received a message, it just isnt a textMessage!"); writer.write("Message " + count +" received at " + String.valueOf(System.currentTimeMillis())); writer.close(); } } catch (IOException ioe) { System.out.println("There was an error creating and writing to the file. Try a different filepath.\n" + ioe.getCause()); } catch (JMSException jmse) { System.out.println("There was a error with the JMS"); jmse.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } *Create deployment descriptors for MDB* This was the missing step in my previous efforts - creating appropriate deployment descriptor resources for the application - ejb.jar.xml and glassfish-ejb-jar.xml - is essential. ****ejb-jar.xml**** <?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee" version = "3.1" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"> <enterprise-beans> <message-driven> <ejb-name>MqTopicMdb</ejb-name> <ejb-class>mq.beans.MqTopicMdb</ejb-class> </message-driven> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>MqTopicMdb</ejb-name> <method-name>onMessage</method-name> <method-params> <method-param>javax.jms.Message</method-param> </method-params> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> *****glassfish-ejb-jar.xml***** <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1- 1.dtd"> <glassfish-ejb-jar> <enterprise-beans> <ejb> <ejb-name>MqTopicMdb</ejb-name> <mdb-resource-adapter> <resource-adapter-mid>activemq-rar-5.5.1</resource-adapter-mid> <activation-config> <activation-config-property> <activation-config-property-name>destination</activation-config-property-name> <activation-config-property-value>jms/activemq/topic</activation-config-property-value> </activation-config-property> <activation-config-property> <activation-config-property-name>destinationType</activation-config-property-name> <activation-config-property-value>javax.jms.Topic</activation-config-property-value> </activation-config-property> </activation-config> </mdb-resource-adapter> </ejb> </enterprise-beans> </glassfish-ejb-jar> *Deploy the application to the glassfish server, and inspect the server log.* You should see output similar to: INFO: 2012-01-23 23:38:31,519 [ad-pool-4848(3)] INFO ActiveMQEndpointWorker - Starting INFO: 2012-01-23 23:38:31,539 [d-pool-1; w: 20] INFO ActiveMQEndpointWorker - Establishing connection to broker [tcp://2.2.2.2:61616] INFO: 2012-01-23 23:38:31,666 [d-pool-1; w: 20] INFO ActiveMQEndpointWorker - Successfully established connection to broker [tcp://2.2.2.2:61616] INFO: ActiveMqMdb_app was successfully deployed in 652 milliseconds. *Create a simple producer* For testing purposes, I also wrote a simple client producer which sends a TextMessage to the jms/activemq/topic destination every 3 seconds: *****JMSClientProducer.java***** package jmsclientproducer; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import javax.jms.Connection; import javax.jms.Destination; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /** * * @author Ant */ public class JMSClientProducer { public static void main(String[] args) { try { HashMap<String, String> props = new HashMap<String, String>(); ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://2.2.2.2:61616"); Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createTopic("jms/activemq/topic"); MessageProducer producer = session.createProducer(destination); connection.start(); TextMessage txtMsg; for (int a = 1; a <= 200; a++) { Thread.sleep(2000); txtMsg = session.createTextMessage(); System.out.println("Sending message " + a + " ..."); Date now = new Date(System.currentTimeMillis()); DateFormat format = DateFormat.getDateTimeInstance(); String nowString = format.format(now); txtMsg.setText("***TextMessage:: " + a + "\ndateTime = " + nowString + "\nMilliseconds = " + System.currentTimeMillis() + "\n This is a test message, set from a standalone client to the ActiveMQ broker, jms/activeMq/testTopic destination\n***"); producer.send(txtMsg); System.out.println("Completed send for message " + a + " ...\n"); } connection.stop(); System.exit(1); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } The activemq-all-5.5.1.jar, activemq-core-5.5.1.jar, slf4j-api.jar, slf4j-log4j-1.2.14.jar and log4j-1.2.14.jar libraries from the activemq/lib directory were added to the client project build path. Cheers, Ant -- View this message in context: http://activemq.2283324.n4.nabble.com/Consume-Topic-messages-from-remote-MDB-ActiveMQ-5-5-1-Glassfish-3-1-1-tp4319980p4323048.html Sent from the ActiveMQ - User mailing list archive at Nabble.com.