4

ActiveMQ メッセージを読み取ろうとしており、いくつかのフィルターに従ってそれらの一部を処理するか、他のメッセージをキューに残します。次のコードで NMS API を使用します。

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

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

4

2 に答える 2

6

そのための実用的なコードを書くのは簡単ではありませんでしたが、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));
                }
            }
        }
于 2011-11-09T16:38:08.010 に答える
5

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

于 2011-11-09T15:57:42.537 に答える