Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何发布到另一个进程中创建的solace临时队列_Java_Solace - Fatal编程技术网

Java 如何发布到另一个进程中创建的solace临时队列

Java 如何发布到另一个进程中创建的solace临时队列,java,solace,Java,Solace,我有一个Java应用程序,它使用队列中的消息。我还有一个测试客户机,它作为单独的Java应用程序运行,并将消息发布到该队列 为了在本地测试侦听器应用程序,我让它创建一个临时队列并侦听该队列。以下是我用于Tibco的侦听器代码: session = connection.createQueueSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE); Queue queue; if (useTemporaryRequestQueue) { qu

我有一个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示例中的
rrguarantedRequester.java
rrguarantedReplier.java
,其中请求者创建一个临时队列作为
ReplyTo
目的地,应答者通过向该临时队列发布保证消息进行应答

在rrguarantedreplier.java中:

private void sendReply(XMLMessage request, XMLMessage reply) throws Exception {
    Destination replyDestination = null;
    replyDestination = request.getReplyTo();
    ...        
    producer.send(reply, replyDestination);
}
在rrguarantedRequester.java中:

void doRequest(Destination requestDestination, Operation operation, int leftHandOperand, int rightHandOperand) throws Exception {
    Queue replyQueue = session.createTemporaryQueue();
    ...
    request.setDeliveryMode(DeliveryMode.PERSISTENT);
    request.setReplyTo(replyQueue);
    ...
}

您可以从下载API中包含的完整示例集。

solace中有一个创建临时队列的API,但它不会将队列名称作为参数,而是会分配临时队列名称作为参数。请尝试以下示例:

    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();
有关请求-响应模型的一些信息,请参阅此链接:

可选地,您可以考虑使用临时主题从测试客户端发布,并使用固定队列来执行临时主题的通配符卡订阅。p>


谢谢,但这不是我要解决的用例。我的测试客户机与您描述的完全一样,但对于独立测试,我希望在对话的两侧使用临时队列,就像我对Tibco所做的那样。我假设您指的是每一侧的临时队列,而不是双方共享的临时队列。但是一方必须告诉另一方他们的队列的名称,请求-应答将很好地解决这个问题。如果不知何故,您神奇地知道临时队列的名称,那么一种黑客方法就是使用JCSMPSession.createTemporaryQueue(字符串黑客)。这里,hack=tmp_queue.name().substring(tmp_queue.name().lastIndexOf('/')+1)。请注意,这种攻击可能在其他版本中不起作用。忘了提及这种攻击方式仅适用于底层JCSMP API,而不是JMS。在我的示例中,每侧都有一个临时队列,但其中一个是共享的,正如我试图在编辑中显示的那样(查找$TMP$.server.UID)。由于临时队列的使用从一开始就有点像黑客,我将看看你的黑客是否能满足我的需要。使用JCSMP API将需要完全重写我的测试客户机,因为我的所有其他代码都使用JMS和JNDI。我需要寻找另一个解决方案。我在问题中添加了示例代码(希望)使问题更清楚。答案的第一部分不是我需要的,但也许你可以详细说明临时主题的想法。如果临时主题solace允许你在运行时创建一个主题,你可以为临时主题使用一个名称空间,比如/temp/test/{testid}您可以让队列订阅名称空间q.test-->subscribes to/temp/test/>。此处“>”表示通配符表达式。在运行时,您的主题类似于/temp/test/1234,指向此主题的所有消息都转到q.test。如果它符合你的目的,你可以试一试。