为什么消费者不ActiveMQ的临时队列产生的?(Why is consumer not creat

2019-09-16 23:27发布

除了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();

Flollowing代码工作: - 但是队列似乎是一个持久的队列不是一个临时队列

                        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的)它是working.but它创建一个永久队列。 因此,当我直接使用临时队列答复目的地,它不工作。

Answer 1:

  1. 而不是使用C#,Java编写的代码,因为它是一个的ActiveMQ最好套件。 阅读这里使用的临时队列在java中的例子。
  2. 然后把它编译成一个JAR文件,你可以通过IKVM.NET描述在你的C#代码导入它在这里
  3. 希望它会与这方面的工作。

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



Answer 2:

创建ActiveMQTempQueue直接从对象NMSReplyTo.ToString方法可能导致此问题,你作为ToString方法不保证返回从中可以创建匹配目的地的价值。 既然你不知道发件人是否已指定一个临时目的地或一个正常的坏编码为好。 正确的事情做的仅仅是创建一个使用会话的创造消费者方法使用一个新的消费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);
                }
            }
        }
    }
}


Answer 3:

临时队列只存在仅在创建它的连接存在。 在你的示例代码,你开始连接之前创建它,所以我认为它只是示数出默默地因为没有有效的连接。



文章来源: Why is consumer not created for ActiveMQ Temp Queue?