2011-11-09 7 views
2

ActiveMQメッセージを読み込み、一部のフィルタで処理したり、他のメッセージをキューに残したりしようとしています。 私は次のコードでNMSのAPIを使用します。削除しないでActiveMQメッセージを読む

 Uri connecturi = new Uri("activemq:tcp://model.net:61616"); 
     IConnectionFactory factory = new NMSConnectionFactory(connecturi); 
     List<ModelBuilderBase> result = new List<ModelBuilderBase>(); 
     using (IConnection connection = factory.CreateConnection()) 
     using (ISession session = connection.CreateSession()) 
     { 
      IDestination destination = SessionUtil.GetDestination(session, "queue://cidModelbuilderQ"); 
      using (IMessageConsumer consumer = session.CreateConsumer(destination)) 
      { 
       connection.Start(); 
       ITextMessage message; 
       while ((message = consumer.ReceiveNoWait() as ITextMessage) != null) 
       { 
        if (message.Properties[MANDATOR] == null || message.Properties[REFCODE] == null) 
         continue; 
        var mandator = message.Properties[MANDATOR].ToString(); 
        var refCode = message.Properties[REFCODE].ToString(); 
        result.Add(ModelBuilderFactory.Instance.GetInstance(refCode, mandator)); 
       } 
      } 

問題は、メッセージが受信された後にメッセージが削除されていることです。何らかの形でこの動作を変更し、正常に処理した後で手動でメッセージを削除することはできますか? }

答えて

3

QueueBrowserオブジェクトを作成して、指定されたキューのメッセージを確認します。メッセージのロジックを実行し、指定されたキューからメッセージを受信するQueueReceiverオブジェクトを作成します。

3

それはそのための作業コードを書くのは簡単ではなかったが、ARSは答えのおかげで、私は今、この作業ソリューションがあります。

 Uri connecturi = new Uri("activemq:tcp://model.net:61616"); 
     IConnectionFactory factory = new NMSConnectionFactory(connecturi); 
     List<ModelBuilderBase> result = new List<ModelBuilderBase>(); 
     using (IConnection connection = factory.CreateConnection()) 
     using (ISession session = connection.CreateSession()) 
     { 

      IDestination destination = SessionUtil.GetDestination(session, "queue://cidModelbuilderQ"); 
      using (IMessageConsumer consumer = session.CreateConsumer(destination)) 
      { 
       connection.Start(); 
       var q = session.GetQueue("cidModelbuilderQ"); 
       var b = session.CreateBrowser(q); 
       var msgs = b.GetEnumerator(); 
       while (msgs.MoveNext()) 
       { 
        ITextMessage message = msgs.Current as ITextMessage; 
        if (message.Properties[MANDATOR] == null || message.Properties[REFCODE] == null) 
         continue; 
        var mandator = message.Properties[MANDATOR].ToString(); 
        var refCode = message.Properties[REFCODE].ToString(); 
        result.Add(ModelBuilderFactory.Instance.GetInstance(refCode, mandator)); 
       } 
      } 
     } 
関連する問題