1

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 を使用) では機能していますが、永続的なキューが作成されます。したがって、一時キューの返信先を直接使用すると、機能しません。

4

3 に答える 3

0

一時キューは、それを作成した接続が存在する場合にのみ存在します。サンプルコードでは、接続を開始する前に作成しているので、アクティブな接続がないため、サイレントにエラーが発生していると思います。

于 2012-05-05T03:03:08.680 に答える
0

ActiveMQTempQueueメソッドから直接オブジェクトを作成すると、メソッドが一致する宛先を作成できる値を返すことが保証されていないためNMSReplyTo.ToString、ここで問題が発生する可能性があります。ToString送信者が一時的な宛先を指定したのか、それとも通常の宛先を指定したのかがわからないため、コーディングも不適切です。NSMReplyTo正しいことは、宛先をそのまま 使用して、セッションの create consumer メソッドを使用して新しいコンシューマーを作成することです。

以下は、Apache.NMS.Stomp および Apache.NMS.ActiveMQ で動作する NMS プロジェクトの簡単な要求応答テスト ケースです。

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);
                }
            }
        }
    }
}
于 2012-05-02T11:27:57.460 に答える
0
  1. ActiveMQ に最適なスイートであるため、C# を使用するのではなく、Java でコードを記述します。Java で一時キューを使用する例については、こちらを参照してください。
  2. そして、それを JAR ファイルにコンパイルすると、ここで説明されているように、IKVM.NET 経由で C# コードにインポートできます。
  3. これでうまくいくことを願っています。

注: 別のセッションで一時キューを使用できないことを知っておく必要があります。

于 2012-05-10T11:58:32.627 に答える