http://genericjmsra.java.net/docs/userguide/userguide.html
I've tried multiple time to get this to work with an external OpenMQ broker. At first GlassFish was throwing an NPE because there was no physical destination name, but even after setting one on the JMS destination, I still get the following exception in the server logs:
SEVERE: Missing Destination JNDI Name
SEVERE: MDB00017: [JMSReceiver]: Exception in creating message-driven bean container: [com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in Runtime DD: missing destination JNDI name]
SEVERE: com.sun.appserv.connectors.internal.api.ConnectorRuntimeException
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Error in Runtime DD: missing destination JNDI name
at com.sun.enterprise.connectors.jms.system.ActiveJmsResourceAdapter.updateMDBRuntimeInfo(ActiveJmsResourceAdapter.java:1855)
at com.sun.enterprise.connectors.inbound.ConnectorMessageBeanClient.setup(ConnectorMessageBeanClient.java:186)
at com.sun.ejb.containers.MessageBeanContainer.<init>(MessageBeanContainer.java:204)
at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:121)
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:234)
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:290)
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:101)
at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:186)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:249)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465)
at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222)
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168)
at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:234)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:619)
My Message-driven bean:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "ConnectionJndiName", propertyValue = "jms/BaTUpdatesTopicConnectionFactory"),
@ActivationConfigProperty(propertyName = "DestinationName", propertyValue = "jms/BaTUpdatesTopic"),
@ActivationConfigProperty(propertyName = "DestinationType", propertyValue = "javax.jms.Topic")
})
public class JMSReceiver implements MessageListener {
@Override
public void onMessage(Message message) {
... do something ...
}
}
The relevant bits of domain.xml are:
<connector-connection-pool name="BaTUpdatesConnectionPool" resource-adapter-name="genericra" connection-definition-name="javax.jms.TopicConnectionFactory"></connector-connection-pool>
<connector-resource pool-name="BaTUpdatesConnectionPool" jndi-name="jms/BaTUpdatesTopicConnectionFactory"></connector-resource>
<resource-adapter-config resource-adapter-name="genericra">
<property name="XATopicConnectionFactoryClassName" value="com.sun.messaging.XATopicConnectionFactory"></property>
<property name="QueueConnectionFactoryClassName" value="com.sun.messaging.QueueConnectionFactory"></property>
<property name="TopicConnectionFactoryClassName" value="com.sun.messaging.TopicConnectionFactory"></property>
<property name="ConnectionFactoryClassName" value="com.sun.messaging.ConnectionFactory"></property>
<property name="QueueClassName" value="com.sun.messaging.Queue"></property>
<property name="UserName" value="admin"></property>
<property name="Password" value="admin"></property>
<property name="ConnectionFactoryProperties" value="imqAddressList=mq://openmqtestbroker.mathworks.com:7676/jms"></property>
<property name="ProviderIntegrationMode" value="javabean"></property>
<property name="SupportsXA" value="true"></property>
<property name="XAConnectionFactoryClassName" value="com.sun.messaging.XAConnectionFactory"></property>
<property name="CommonSetterMethodName" value="setProperty"></property>
<property name="TopicClassName" value="com.sun.messaging.Topic"></property>
<property name="LogLevel" value="info"></property>
<property name="XAQueueConnectionFactoryClassName" value="com.sun.messaging.XAQueueConnectionFactory"></property>
</resource-adapter-config>
<admin-object-resource res-adapter="genericra" res-type="javax.jms.Topic" description="" jndi-name="jms/BaTUpdates">
<property name="DestinationProperties" value="Name=BaT_Updates"></property>
<property description="null" name="Name" value="BaT_Updates"></property>
</admin-object-resource>
</resources>
<servers>
<server name="server" config-ref="server-config">
<application-ref ref="__admingui" virtual-servers="__asadmin"></application-ref>
<application-ref ref="genericra" virtual-servers="server"></application-ref>
<resource-ref ref="jdbc/__TimerPool"></resource-ref>
<resource-ref ref="jdbc/__default"></resource-ref>
<resource-ref ref="jms/BaTUpdatesTopicConnectionFactory"></resource-ref>
<resource-ref ref="jms/BaTUpdates"></resource-ref>
</server>
</servers>
I have a need to use GenericJMSRA to call my own connection factories that in turn delegate back to the OpenMQ factories, but I wanted to try something simpler first and I just can't seem to get it to work.
-Eric