Реализация MSMQ C # с использованием сервиса (ServiceBase) - PullRequest
0 голосов
/ 04 февраля 2011

Я буду использовать MSMQ в C # для чтения сообщений; и я помещаю это в Window Service, так что OnStart я начну читать сообщения с использованием метода queue.Receive, который будет блокировать / синхронный вызов. И методом OnEnd я хочу остановить очередь с помощью queue.Close (); queue.Dispose ().

Есть ли у этого подхода недостатки?

Спасибо Ocean

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Это неверный подход. OnStart вызывается один раз, когда запускается служба, вы должны поставить логику инициализации. Например, запустить поток, который будет вызывать Receive в цикле.

1 голос
/ 04 февраля 2011

Это довольно распространенная модель, но она имеет некоторые недостатки.

Во-первых, вы должны рассмотреть возможность использования пула потоков (или параллельных библиотек .NET в 4.0) для асинхронной обработки ваших сообщений. То, может ли ваше устройство чтения очереди быть асинхронным, во многом зависит от вашей схемы транзакций. Будет ли обработка атомарной?

Во-вторых, вам также следует рассмотреть возможность использования таймера (System.Timers.Timer), который вы запускаете в OnStart и заканчиваете в OnEnd и который читает одно или несколько сообщений из очереди при каждом событии таймера.

В-третьих, вы должны серьезно подумать только об использовании привязки WCF MSMQ, которая решает многие сложные вопросы.

См .: http://jamescbender.com/bendersblog/archive/2009/04/04/the-one-where-i-talk-about-the-msmq-binding.aspx

1 голос
/ 04 февраля 2011

Ваш подход выглядит хорошо для меня.Мой единственный совет - убедиться, что каждый компьютер, на котором вы собираетесь развернуть Службу Windows, находится либо в одном Домене, либо в Домене с взаимным доверием и находится в одном и том же Лесу .Недавно у меня возникла проблема с решением, которое я унаследовал с использованием MSMQ, и это работало почти так же, как вы предложили выше.Он был протестирован как работающий на одном домене без проблем с производительностью.К сожалению, клиент находился в процессе слияния, и когда пришло время внедрять решение в рамках более широкой компании, оказалось, что решение должно быть реализовано на машинах, которые существуют в разных доменах в разных лесах, и в этом случае MSMQне будет работать вообще, и совершенно другой подход должен быть использован.

...