如何发布到在另一个过程中创建的固定温度队列



我有一个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.javaRRGuaranteedReplier.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中包含的完整样本集

有一个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/

最新更新