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]