Найти старые сообщения в MSMQ - PullRequest
1 голос
/ 26 января 2011

У этого сценария есть две очереди.«Ошибка» и «MyQueue».

Сообщения сбрасываются в MyQueue и обрабатываются оттуда.Если они терпят неудачу, они перемещаются в очередь ошибок.Администрация может переместить сообщение обратно в MyQueue для повторной обработки.

Моя задача, если отсканировать / просмотреть две очереди, чтобы найти и сосчитать все сообщения, которые циклически повторяются в течение более одного часа.

Кажется, что

message.SentTime
message.ArrivedTime

бесполезны, так как они обновляются каждый раз, когда сообщение попадает в очередь.

Решение состоит в том, чтобы поместить метку времени втело сообщения, однако, это потребовало бы от меня открытия всех сообщений, чтобы определить, является ли сообщение "старым".

Есть ли лучшие альтернативы?

Ответы [ 2 ]

1 голос
/ 27 января 2011

Проблема в том, что это не одно и то же сообщение, циклически повторяющееся в очередях. «Перемещение» сообщения обычно приводит к удалению оригинала и созданию нового на основе исходного содержимого, поэтому вы не можете использовать время отправки и прибытия.

Есть ли у перемещенных сообщений новые уникальные значения MessageID каждый раз? Если нет, то, возможно, вы могли бы сгенерировать таблицу, совпадающую с идентификатором MessageID во время его первоначального создания.

Приветствия
Джон Брейквелл

0 голосов
/ 27 января 2011

Для этого вы можете использовать свойство AppSpecific класса Message. К сожалению, это 32-разрядное целое число; если бы он был длинным, вы могли бы хранить DateTime.Ticks там, а затем использовать его в качестве метки времени, вам нужно вычислить, как долго было около сообщения.

Вы можете потерять некоторые биты в тиках, чтобы соответствовать значению в AppSpecific следующим образом:

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

Это дает вам вторую шкалу точности, которую, я полагаю, достаточно для вашего случая ... однако вы не можете использовать встроенные методы DateTime или TimeSpan, которые конвертируют обратно из тиков, если вы это сделаете, так преобразовать вручную или просто вычислить дельту между Now и этим значением.

...