У меня есть очередь без передачи с получателем в одном процессе и сценарий 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 байтов сообщения.
Очередь, отправитель и получатель находятся на одном компьютере.