2011-01-26 8 views
1

このシナリオには2つのキューがあります。 "エラー"と "MyQueue"。MSMQで古いメッセージを検索

メッセージはMyQueueにダンプされ、そこから処理されます。失敗した場合、エラーキューに移動します。 管理者は、再度処理するためにメッセージをMyQueueに戻すことがあります。

2つのキューをスキャンして1時間以上サイクリングしていたすべてのメッセージを数えてカウントするのは私の仕事です。

は、彼らが、メッセージがキューに入るたびに更新されているので

message.SentTime 
message.ArrivedTime 

は、両方の役に立たないと思われます。

解決策では、メッセージの本文にタイムスタンプを入れることになりますが、これはメッセージが「古い」かどうかを判断するためにすべてのメッセージを開く必要があります。

もっと良い選択肢はありますか?

答えて

1

問題は、キューの周りを循環する同じメッセージではないということです。 「移動する」というメッセージは通常、元の内容を削除して元の内容に基づいて新しいメッセージを作成するため、送信された時刻と到着した時刻は使用できません。

移動したメッセージに毎回新しい一意のMessageID値がありますか?そうでなければ、最初に作成された時にMessageIDと一致するテーブルを生成することができます。

乾杯
ジョンBreakwell良い答えのための

+1

メッセージの移動方法を入力して説明してくれてありがとう。自分の家事を自分でやっていなくても、私の使命を達成する方法がないように見える – Rasmus

0

MessageクラスのAppSpecificプロパティを使用することができます。残念ながら、それは32ビットの整数です。それが長い場合、そこにDateTime.Tickを格納し、それをタイムスタンプとして使用して、メッセージがどれぐらいの長さであったかを計算する必要があります。

あなたはこのようAppSpecificに値を合わせてダニのビットの一部を失う可能性があります:

ticksInt = (int) DateTime.Now.Ticks >> 23; 

これはあなたに私はあなたのケースのために十分であると仮定秒スケールの精度を与える...しかし、あなたができますこの場合、Ticksから戻ってきた組み込みのDateTimeメソッドやTimeSpanメソッドを使用しないでください。手動で変換するか、またはNowとこの値の間のデルタを計算する必要があります。

+1

ありがとう! 残念ながら、キューはNServiceBusによって管理されているため、キューにデータを読み込むコードではありません.NServiceBusにmessage.AppSpecificにタイムスタンプを設定することはできません。 – Rasmus

関連する問題