我有一个Java应用程序,该应用程序会消耗队列中的消息。我还有一个测试客户端,该客户端作为单独的Java应用程序运行,并将消息发布给该队列。
要在本地测试侦听器应用程序,我会创建一个临时队列并收听该队列。以下是我用于TIBCO的侦听器代码:
session = connection.createQueueSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
Queue queue;
if (useTemporaryRequestQueue) {
queue = session.createTemporaryQueue();
requestQueueName = queue.getQueueName(); // $TMP$.server.UID
} else {
queue = session.createQueue(requestQueueName);
}
receiver = session.createReceiver(queue);
receiver.setMessageListener(this);
在我的测试客户端中,我可以使用以下代码连接到TIBCO请求队列:
session = connection.createQueueSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
requestQueue = session.createQueue(requestQueueName); // $TMP$.server.UID
responseQueue = session.createTemporaryQueue();
当我尝试使用Solace Temp队列名称的CreateQueue调用时,它会失败:
java.lang.IllegalArgumentException: Non-durable endpoints are not allowed as an argument to provision
at com.solacesystems.jcsmp.impl.JCSMPBasicSession.provision(JCSMPBasicSession.java:1183)
at com.solacesystems.jms.SolSession.createQueue(SolSession.java:492)
是否有另一种方法可以从我的测试客户端连接到临时队列?
您不应该在发布者中创建队列。
在API样本中查看RRGuaranteedRequester.java
和RRGuaranteedReplier.java
,在此示例中,请求者将临时队列作为ReplyTo
目标创建,然后通过向该临时队列发布保证消息来回复。
在rrguaranteedreplier.java中:
private void sendReply(XMLMessage request, XMLMessage reply) throws Exception {
Destination replyDestination = null;
replyDestination = request.getReplyTo();
...
producer.send(reply, replyDestination);
}
在rrguaranteedrequester.java中:
void doRequest(Destination requestDestination, Operation operation, int leftHandOperand, int rightHandOperand) throws Exception {
Queue replyQueue = session.createTemporaryQueue();
...
request.setDeliveryMode(DeliveryMode.PERSISTENT);
request.setReplyTo(replyQueue);
...
}
您可以从http://dev.solace.com/downloads/。
有一个API可以在solace中创建临时队列,但这并不以队列名称为参数,而是将有临时的队列名称为返回。尝试以下样本:
Queue queue = session.createTemporaryQueue(); // create a queue like '#P2P/QTMP/v:solace/2d78591c-f465-4bac-9a20-e09c04641538'
MessageConsumer consumer = session.createConsumer(queue);
connection.start();
TextMessage testMessage = session.createTextMessage("sample message");
MessageProducer producer = session.createProducer(queue);
producer.send(testMessage);
TextMessage msg = (TextMessage)consumer.receive();
请参阅此链接以获取有关请求响应模型的一些信息:http://dev.solace.com/get-started/jms-tutorials/request-reply_jms/
另外,您可以考虑使用临时主题从测试客户端发布,并使用固定的队列进行临时主题的通配符卡订阅。
http://dev.solace.com/get-started/jms-tutorials/request-reply_jms/