Hi all,

I'm trying to get QPID JCA adapter, Glassfish, and RabbitMQ to work
together. At this point, I believe that the Destination is not recreated correctly from the initial Queue when creating a MessageProducer. I can see in the log messages that the Queue is populated correctly when initially created, but later when the Session is creating the MessageProducer, it is empty, causing AMQNoRouteException. It would be really nice if this could be addressed in your next release.

I downloaded the 0.30-rc code (r6489 I think) and built with maven, with one change as listed below. It allows use of the JCA adapter if
transactions are not required. When I create a MessageProducer, I get
the following error:
org.apache.qpid.client.AMQNoRouteException: Error: NO_ROUTE [error code
312: no route]

RabbitMQ 3.3.4 reports that the exchange 'outbound' exists on the server just fine, under the /qpid virtual host. I have no errors in the
RabbitMQ log. It makes no difference I can see if I create the queue or
exchange manually or let the adapter create them.

The code seems to connect fine, negotiate AMQP 0-9-1, username and
passwords work (as noted below), but when actually pushing a message I
get the no route error. I do find it odd that the actual connection
attempt believes I'm using an ADDR value when I setup a BURL queue. Any
ideas?

If nothing else, could the trivial patch below be applied?

Thanks!
Nathan Kunkee


How did I get this to run on Glassfish?

In order to see log messages, I had to enable log4j messages, by
dropping a .properties file in
$GLASSFISH/glassfish/domains/domain1/lib/classes which turned on
log4j.rootLogger=DEBUG. Then I had to add to the jvm options of the
server instance an option to
-Dlog4j.configuration=nkunkee.log.properties and restart.

Next was configuring the JCA adapter. I had to make a resource adapter
config first,
asadmin create-resource-adapter-config --threadpoolid thread-pool-1
--property
TransactionManagerLocatorMethod=getTm:TransactionManagerLocatorClass=org.apache.qpid.ra.tm.GlassfishTransactionManagerLocator:ConnectionURL=amqp://qpid:qpid@macbook/interop?brokerlist='tcp://localhost:5672'
qpid-ra-0.30

Escaped for bash:
asadmin create-resource-adapter-config --threadpoolid thread-pool-1
--property
ConnectionURL=amqp\\://qpid\\:qpid@macbookra/qpid\?brokerlist\\=\\\'tcp\\://localhost\\:5672\\\':TransactionManagerLocatorMethod=getTm:TransactionManagerLocatorClass=org.apache.qpid.ra.tm.GlassfishTransactionManagerLocator
qpid-ra-0.30

Note the name has to match the resource adapter. Note those are supposed to be one line. Next I can add the log4j and slf4j libraries to the rar file, since the Glassfish class loader seems to need them there, then deploy it.
zip -u qpid-ra-0.30.rar log4j-1.2.16.jar slf4j-log4j12-1.6.4.jar
asadmin deploy qpid-ra-0.30.rar

Next I can create the connection objects:
#note that yes, you have to specify the connect string in
# the alternative properties; they don't cascade from the
# ra config or ConnectionURL
asadmin create-connector-connection-pool --raname qpid-ra-0.30
--transactionsupport NoTransaction --connectiondefinition
org.apache.qpid.ra.QpidRAConnectionFactory --property
UseTryLock=0:SessionDefaultType=javax.jms.Queue:Host=linus59.gsc.wustl.edu:Port=5672:UserName=qpid:Password=qpid:ClientId=macbook:Path=/qpid
qpid30-test-pool

asadmin create-connector-resource --poolname qpid30-test-pool
qpid30-test-conn

asadmin create-admin-object --raname qpid-ra-0.30 --restype
org.apache.qpid.ra.admin.QpidQueue --classname
org.apache.qpid.ra.admin.QpidQueueImpl --property
DestinationAddress=BURL\:direct\://outbound//fromjava qpid30-test-queue

My code at the moment is fairly simple:

    @Resource(lookup = "qpid30-test-conn")
    private ConnectionFactory testCF;

    @Resource(lookup = "qpid30-test-queue")
    private Queue testQueue;

    public String pushMessage() {
        try {
            Connection connection;
            Session session;
            MessageProducer msgProducer;
            TextMessage msg;

            System.out.println("NKUNKEE--connect to send");
            connection = testCF.createConnection();
            session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
            System.out.println("NKUNKEE--session is " +
session.toString());
            msgProducer = session.createProducer(testQueue);
            msg = session.createTextMessage(visibleText);
            msgProducer.send(msg);
            System.out.println("NKUNKEE--send message:"+visibleText);

            session.close();
            connection.close();
        }

This is attached to a button on a JSF page, so that it sends a message
when i push the button. When I push the button, I get an error:
Caused by: java.lang.UnsupportedOperationException: 0_8 version does not
provide XA support

I do not need full XA support in the Java sense, and turned it off when I made the connector pool, so the below patch gets me past that issue:

Index: jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java
===================================================================
--- jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java
(revision 1624621)
+++ jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnection.java
(working copy)
@@ -782,7 +782,10 @@
                 _connection =
_mcf.getDefaultAMQConnectionFactory().createXATopicConnection();
             }

-            _xaSession =
((XATopicConnection)_connection).createXATopicSession();
+            if (transacted)
+            {
+                _xaSession =
((XATopicConnection)_connection).createXATopicSession();
+            }
             _session =
((TopicConnection)_connection).createTopicSession(transacted,
acknowledgeMode);

          }
@@ -797,7 +800,10 @@
                 _connection =
_mcf.getDefaultAMQConnectionFactory().createXAQueueConnection();
             }

-            _xaSession =
((XAQueueConnection)_connection).createXAQueueSession();
+            if (transacted)
+            {
+                _xaSession =
((XAQueueConnection)_connection).createXAQueueSession();
+            }
             _session =
((QueueConnection)_connection).createQueueSession(transacted,
acknowledgeMode);

          }
@@ -811,7 +817,10 @@
             {
                 _connection =
_mcf.getDefaultAMQConnectionFactory().createXAConnection();
             }
-            _xaSession = ((XAConnection)_connection).createXASession();
+            if (transacted)
+            {
+                _xaSession = ((XAConnection)_connection).createXASession();
+            }
             _session =  _connection.createSession(transacted,
acknowledgeMode);
          }


When I rebuild the rar file, including the jar libs again, then undeploy and redeploy the rar, I am at the state above where I discuss the error,

Info:   20110 [pool-26-thread-1] DEBUG
org.apache.qpid.client.AMQDestination  - Based on 'outbound'/'fromjava'; {
  'node': {
    'type': 'queue'
  }
} the selected destination syntax is ADDR
Info:   20111 [pool-26-thread-1] DEBUG org.apache.qpid.client.AMQSession
 - Message returned with error code 312: no route (NO_ROUTE)
Info:   20112 [pool-26-thread-1] DEBUG
org.apache.qpid.client.AMQConnection  - exceptionReceived done
by:pool-26-thread-1
org.apache.qpid.client.AMQNoRouteException: Error: NO_ROUTE [error code
312: no route]
        at org.apache.qpid.client.AMQSession_0_8$6.run(AMQSession_0_8.java:783)

It seems like this is trying to send using an empty desitiation.

____
This email message is a private communication. The information transmitted, 
including attachments, is intended only for the person or entity to which it is 
addressed and may contain confidential, privileged, and/or proprietary 
material. Any review, duplication, retransmission, distribution, or other use 
of, or taking of any action in reliance upon, this information by persons or 
entities other than the intended recipient is unauthorized by the sender and is 
prohibited. If you have received this message in error, please contact the 
sender immediately by return email and delete the original message from all 
computer systems. Thank you.

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to