MessageQueue.Send иногда завершается ошибкой с InvalidOperationException, BadEnumerator - PullRequest
2 голосов
/ 17 января 2011

У меня есть очередь без передачи с получателем в одном процессе и сценарий PowerShell, который использует метод MessageQueue.Send (объект, метка) для постановки в очередь сообщений. Иногда я получаю странную ошибку в скрипте PowerShell (отправитель):

An error occurred while enumerating through a collection: Message that the cursor is   currently pointing to has been removed from the queue by another process or by another call to Receive without the use of this cursor..
+ CategoryInfo          : InvalidOperation: (System.Messaging.MessageEnumerator:MessageEnumerator) [], RuntimeException
+ FullyQualifiedErrorId : BadEnumeration

Я не могу понять, как MessageEnumerator участвует в отправляющей части? Любые подсказки?

Принимающая часть (служба, написанная на .net, также использующая System.Messaging для взаимодействия с MSMQ) выполняет свою работу в цикле while, в котором выполняет queue.Peek (время ожидания 1 с), а затем вызывает queue.Receive. (). Все исключения MSMQ регистрируются получателем, но журнал пуст. Все ошибки происходят в отправляющем скрипте PowerShell.

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

Первый выстрел с подключенным приемником, некоторые вызовы MessageQueue.Send () привели к ошибке.

Этот скрипт выглядел так:

begin {
    $q = Create-QueueInstance
}
process {
    $messagesToSend | %{
        Send-Message $q $_
    }
}
end {
    $q.Dispose()
}

Второй выстрел Я пытался расположить экземпляр очереди на каждой итерации, если проблема была связана с не высвобождением общих ресурсов и т. Д .:

Этот скрипт выглядел так:

process {
    $messagesToSend | %{
        $q = Create-QueueInstance
        Send-Message $q $_
        $q.Dispose()
    }
}

Ошибка по-прежнему возникает, но я считаю, что она встречается реже.

Я использую конструктор по умолчанию для создания очереди, без настройки DefaultPropertiesToSend или чего-либо еще. Сообщения представляют собой сериализуемые объекты XML, которые выдают около 300 байтов сообщения. Очередь, отправитель и получатель находятся на одном компьютере.

1 Ответ

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

Почему служба выполняет Peek-then-Receive?
Проверяет, что сообщение именно то, что ему нужно, или нет?
Если да, то используете ли вы PeekNext для перемещения по очереди?
Служба получателя многопоточная?
Просто пытаюсь понять, где в него входят курсоры.

Довольно странная проблема.

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

...