I am using jboss 5.0.1, and websphere 6
I want to develop an MDB and have it connect to a queue in websphere.
I followed the instructions from here:
http://www.jboss.org/community/docs/DOC-12535
and was successfull. My MDB connected to the queue and everything worked.
In that document, I am adviced to put some queue properties inside ejb-jar.xml or I can do
it with annotations. My problem is that both alternatives make the ejb non configurable,
it is now hard coded to connect to a specific host and queue manager.
I would like to get the queue configuration passed to the MDB via jndi, and then I would
configure the connectionFactory and the destination on a xxx-ds.xml file. So far I have
this:
on my ds.xml file I have this:
| <?xml version="1.0" encoding="UTF-8"?>
| <!DOCTYPE connection-factories PUBLIC "-//JBoss//DTD JBOSS JCA Config
5.0//EN" "http://www.jboss.org/j2ee/dtd/jboss-ds_5_0.dtd">
|
| <connection-factories>
|
| <tx-connection-factory>
| <jndi-name>WSMQConnectionFactory</jndi-name>
| <xa-transaction />
| <rar-name>wmq.jmsra.rar</rar-name>
|
<connection-definition>javax.jms.ConnectionFactory</connection-definition>
| <config-property name="channel"
type="java.lang.String">CASPERCHANNEL01</config-property>
| <config-property name="hostName"
type="java.lang.String">my.host.com</config-property>
| <config-property name="port"
type="java.lang.String">1420</config-property>
| <config-property name="queueManager"
type="java.lang.String">TCASPER01</config-property>
| <config-property name="transportType"
type="java.lang.String">CLIENT</config-property>
|
<security-domain-and-application>JmsXARealm</security-domain-and-application>
| <max-pool-size>20</max-pool-size>
| </tx-connection-factory>
|
|
|
| <mbean code="org.jboss.resource.deployment.AdminObject"
name="jboss.jca:service=WASDestination,name=QueueName">
| <depends
optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='wmq.jmsra.rar'</depends>
| <attribute name="JNDIName">queue/pnr</attribute>
| <attribute name="Type">javax.jms.Queue</attribute>
| <attribute name="Properties">
| baseQueueManagerName=TCASPER01
| baseQueueName=AMR.RPT.DIRECT.PNR
| </attribute>
| </mbean>
|
| </connection-factories>
|
This deploys correctly and I can see both the connectionFactory and the destination in the
jndi tree from jmx-console.
on my ejb I have this:
| import javax.ejb.ActivationConfigProperty;
| import javax.ejb.MessageDriven;
| //import javax.interceptor.Interceptors;
| import javax.jms.Message;
| import javax.jms.MessageListener;
| import javax.jms.TextMessage;
|
| import org.apache.commons.logging.Log;
| import org.apache.commons.logging.LogFactory;
| //import org.springframework.beans.factory.annotation.Autowired;
| //import org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor;
|
|
| /**
| * Message-Driven Bean implementation class for: MessageBeanEJB
| *
| */
| @MessageDriven(activationConfig = {
| @ActivationConfigProperty(propertyName = "destinationType", propertyValue
= "javax.jms.Queue"),
| @ActivationConfigProperty(propertyName = "destination", propertyValue =
"queue/pnr"),
| })
| //(a)Interceptors(SpringBeanAutowiringInterceptor.class)
| public class MessageBeanEJB implements MessageListener {
|
| //@Autowired
| //private PnrProcessor pnrProcessor;
|
| private final Log log = LogFactory.getLog(MessageBeanEJB.class);
|
| /**
| * Default constructor.
| */
| public MessageBeanEJB() {
| // TODO Auto-generated constructor stub
| }
|
| /**
| * @see MessageListener#onMessage(Message)
| */
| public void onMessage(Message message) {
| TextMessage msg = null;
|
| try {
| if (message instanceof TextMessage) {
| msg = (TextMessage) message;
| String data = msg.getText();
|
| log.info(String.format("Received message %s", data));
| //pnrProcessor.process(data);
|
| } else {
| log.error(String.format("Invalid message type %s received. Expecting
text message ",message.getClass().getName()));
| }
| } catch (Throwable te) {
| log.error("unable to process message",te);
| RuntimeException ex = new RuntimeException("Unable to process
message");
| ex.initCause(te);
| throw ex;
| }
|
| }
|
| }
|
on my jboss.xml I have this:
| <?xml version="1.0" encoding="UTF-8"?>
| <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_5_0.dtd">
|
| <jboss>
| <enterprise-beans>
| <message-driven>
|
| <ejb-name>MessageBeanEJB</ejb-name>
| <resource-adapter-name>wmq.jmsra.rar</resource-adapter-name>
| </message-driven>
| </enterprise-beans>
|
| <container-configurations>
|
| </container-configurations>
| </jboss>
|
Note that I am already hardcoding inside the ejb inside jboss.xml that it uses the
resource adapter wmq.jmsra.rar. which is undesirable.
When I deploy it to jboss, this is the result:
| ...
|
| Caused by: com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Failed to
connect to queue manager '' with connection mode 'Client' and host name
'localhost'. Check the queue manager is started and if running in client mode,
check there is a listener running. Please see the linked exception for more information.
| at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:489)
| at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:219)
| at
com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:410)
| at
com.ibm.msg.client.wmq.internal.WMQXAConnection.<init>(WMQXAConnection.java:70)
| at
com.ibm.msg.client.wmq.factories.WMQXAConnectionFactory.createV7ProviderConnection(WMQXAConnectionFactory.java:178)
| at
com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7331)
| at
com.ibm.msg.client.wmq.factories.WMQXAConnectionFactory.createProviderXAConnection(WMQXAConnectionFactory.java:101)
| at
com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createXAConnectionInternal(JmsConnectionFactoryImpl.java:332)
| at
com.ibm.mq.jms.MQXAConnectionFactory.createXAConnection(MQXAConnectionFactory.java:124)
| at
com.ibm.mq.connector.ResourceAdapterConnectionPool.initializeJMSConnection(ResourceAdapterConnectionPool.java:462)
| at
com.ibm.mq.connector.ResourceAdapterConnectionPool.createNewConnection(ResourceAdapterConnectionPool.java:376)
| at
com.ibm.mq.connector.ResourceAdapterConnectionPool.allocateConnection(ResourceAdapterConnectionPool.java:298)
| ... 60 more
|
| ...
|
As you can see from the exception, it is not picking up the queue manager name, or the
hostname from the connectionFactory. In fact it looks to me that it is not using the
configured connectionFactory at all.
Is there a property that I can set on ejb-jar.xml, jboss.xml, or annotation to tell the
ejb to use a specific connectionFactory from jndi?
I have searched all over the web and have been unable to find a way to associate the
connectionFactory with the MDB. I have not found any way to get the queue configuration
out of the ejb, I would like to have it out of the ejb-jar.xml, out of jboss.xml, and out
of the java code, and into a config file in the AS.
My apologies if this has been asked before, but I have been searching for 2 days, and have
been unable to come up with an answer or get it to work.
Please help.
Thanks.
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4219973#...
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&a...