2012-05-02 4 views
1

SimpleMessageListenerContainer 옵션을 제외하고 소비자는 임시 대기열에 대해 생성되지 않습니다. 큐가 보인다 -하지만 : 나는 몇 가지 문제에 대한 SimpleMessageListenerContainer를 사용하지 않습니다 는 (심지어 임시 큐가 생성되지 않음)ActiveMQ 임시 대기열에 대해 소비자가 생성되지 않는 이유는 무엇입니까?

     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 코드가 작동 ... 코드가 작동하지 않는 경우 다음

here.에 직면 영구되지 큐 (NmsDestinationAccessor 사용)와 상기 코드와 임시 큐

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

그것은 영구 큐를 생성 working.but 그것이하다. 그래서 임시 대기열 답장 대상을 직접 사용하면 작동하지 않습니다.

+0

"작성되지 않음"으로 정확히 무엇을 의미합니까? CreateConsumer()가 예외를 던지거나 null을 반환합니까? –

+0

오류가 전혀 없습니다. webconsole에서 볼 때, 심지어 임시 대기열은 두 번째 코드에 대해 생성되지 않습니다. 세 번째 코드의 경우 소비자 만 생성되지 않습니다. –

+0

NMS 프로젝트에서 예제 NUnit 테스트를 추가하여 실제 상황을 보여주었습니다. –

답변

0
  1. C#을 사용하는 대신 ActiveMQ를위한 최상의 제품군이므로 java로 작성하십시오. here for examples using temp queue in java.
  2. 를 읽고 다음 JAR 파일로 컴파일하고
  3. here이이 작동합니다 희망 설명 IKVM.NET를 통해 C# 코드에서 가져올 수 있습니다.

참고 : 다른 세션에서 temperory 대기열을 사용할 수 없음을 알아야합니다.

0

메서드에서 ActiveMQTempQueue 개체를 직접 생성하면 ToString 메서드가 일치하는 대상을 만들 수있는 값을 반환하지 않을 수 있으므로 여기에서 문제가 발생할 수 있습니다. 보낸 사람이 임시 대상을 지정했는지 아니면 정상 대상인지 여부를 알지 못하므로 나쁜 코딩도 마찬가지입니다. 올바른 작업은 단순히 대상인 NSMReplyTo을 그대로 사용하여 세션의 소비자 생성 메소드를 사용하여 새 소비자를 만드는 것입니다.

다음은 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); 
       } 
      } 
     } 
    } 
} 
+0

완전한 코드가 없으면 세 번째 코드가 소비자를 생성 한 다음 사용 블록 바로 다음에 브로커를 등록 취소 할 소비자가 배치 될 것이라고 말할 수 없습니다. –

+0

차이점 : 1) connection.Start()는 consumer를 만들기 전에 넣습니다 .2) connection.createSession은 connection.Start() 앞에 놓입니다. 이유가 될 수 있을까요? –

+0

유일한 것은 connection.Start가 소비자에게 메시지를 보내도록하는 것입니다. 일들이 효과가 없다면 NUnit 테스트 케이스를 만들어 아파치의 새로운 Jira 문제에 붙이는 것이 가장 좋은 방법이다. –

0

임시 대기열은 해당 대기열을 만든 연결이있는 동안에 만 존재합니다. 연결을 시작하기 전에 샘플 코드를 만들고 있으므로 활성 연결이 없으므로 자동으로 오류가 발생한다고 생각합니다.

+0

start를 호출하기 전에 생성하는 것이 합법적인데, 이는 start 메소드의 의도입니다. 일반적으로 start를 호출하기 전에 모든 대상, 생성자 및 소비자를 만듭니다. –

+0

좋아요, 저는 임시 대기열을 사용하지 않았으며 임시 대기열이 생성되지 않았다고해서 그냥 그게 문제라고 생각했습니다. 테스트 케이스에서는 연결이 생성 된 후 만들어 지므로 주요 차이점이있을 것으로 생각됩니다. – Thymine

관련 문제