为什么不为ActiveMQ Temp Queue创建消费者?

SimpleMessageListenerContainer选项外,不会为临时队列创建使用者。 我不会将SimpleMessageListenerContainer用于此处遇到的一些问题。

以下代码不起作用…(即使没有创建临时队列)

  using (IConnection connection = connectionFactory.CreateConnection()) using (ISession session = connection.CreateSession()) { IDestination destination = SessionUtil.GetDestination(session, aQueueName); var replyDestination = session.CreateTemporaryQueue(); // Create a consumer and producer using (IMessageProducer producer = session.CreateProducer(destination)) { // Start the connection so that messages will be processed. connection.Start(); IBytesMessage request = session.CreateBytesMessage(aMsg); request.NMSReplyTo = replyDestination; IMessageConsumer consumer = session.CreateConsumer(replyDestination); consumer.Listener += new MessageListener(this.OnAckRecieved); // Send a message producer.Send(request); ack = this.autoEvent.WaitOne(this.msgConsumeTimeOut, true); consumer.Close(); consumer.Dispose(); ConnectionFactoryUtils.GetTargetSession(session).DeleteDestination(replyDestination); } connection.Close(); session.Close(); 

以下代码正在运行:但队列似乎是一个持久队列而不是临时队列

  using (IConnection connection = connectionFactory.CreateConnection()) using (ISession session = connection.CreateSession()) { IDestination destination = SessionUtil.GetDestination(session, aQueueName); var replyDestination = session.CreateTemporaryQueue(); // Create a consumer and producer using (IMessageProducer producer = session.CreateProducer(destination)) { // Start the connection so that messages will be processed. connection.Start(); IBytesMessage request = session.CreateBytesMessage(aMsg); request.NMSReplyTo = replyDestination; IDestination tempDestination = this.destinationResolver.ResolveDestinationName(session, request.NMSReplyTo.ToString()); IMessageConsumer consumer = session.CreateConsumer(tempDestination); consumer.Listener += new MessageListener(this.OnAckRecieved); // Send a message producer.Send(request); ack = this.autoEvent.WaitOne(this.msgConsumeTimeOut, true); consumer.Close(); consumer.Dispose(); ConnectionFactoryUtils.GetTargetSession(session).DeleteDestination(tempDestination); } connection.Close(); session.Close(); 

使用上面的代码(使用NmsDestinationAccessor)它正在工作。但它创建了一个持久队列。 因此,当我直接使用临时队列回复目的地时,它无法正常工作。

  1. 而不是使用C#,在java中编写代码,因为它是ActiveMQ的最佳套件。 在此处阅读使用java中的临时队列的示例。
  2. 然后将其编译为JAR文件,您可以通过IKVM.NET将其导入c#代码,如此处所述
  3. 希望它能与之相配。

注意:您必须知道不能在不同的会话中使用temperory队列。

直接从NMSReplyTo.ToString方法创建ActiveMQTempQueue对象可能会导致您遇到问题,因为无法保证ToString方法返回可以从中创建匹配目标的值。 由于您不知道发送方是指定了临时目的地还是普通目的地,因此也是错误的编码。 正确的做法是使用会话的create consumer方法创建一个新的使用者,使用NSMReplyTo目标。

这是一个来自NMS项目的简单请求响应测试用例,它与Apache.NMS.Stomp和Apache.NMS.ActiveMQ一起使用。

 namespace Apache.NMS.Test { [TestFixture] public class RequestResponseTest : NMSTestSupport { protected static string DESTINATION_NAME = "RequestDestination"; [Test] [Category("RequestResponse")] public void TestRequestResponseMessaging() { using(IConnection connection = CreateConnection()) { connection.Start(); using(ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge)) { IDestination destination = SessionUtil.GetDestination(session, DESTINATION_NAME); ITemporaryQueue replyTo = session.CreateTemporaryQueue(); using(IMessageConsumer consumer = session.CreateConsumer(destination)) using(IMessageProducer producer = session.CreateProducer(destination)) { IMessage request = session.CreateMessage(); request.NMSReplyTo = replyTo; producer.Send(request); request = consumer.Receive(TimeSpan.FromMilliseconds(3000)); Assert.IsNotNull(request); Assert.IsNotNull(request.NMSReplyTo); using(IMessageProducer responder = session.CreateProducer(request.NMSReplyTo)) { IMessage response = session.CreateTextMessage("RESPONSE"); responder.Send(response); } } using(IMessageConsumer consumer = session.CreateConsumer(replyTo)) { ITextMessage response = consumer.Receive(TimeSpan.FromMilliseconds(3000)) as ITextMessage; Assert.IsNotNull(response); Assert.AreEqual("RESPONSE", response.Text); } } } } } 

临时队列仅在创建它的连接存在时才存在。 在您的示例代码中,您在开始连接之前创建它,因此我认为它只是默认错误,因为没有活动连接。