Разработка распределенных приложений в Microsoft.NET Framework


Использование очередей сообщений MSMQ в NET Framework


Для работы с очередями сообщений используются классы из пространства имен System.Messaging. Класс System.Messaging.MessageQueue содержит три группы методов.

  • Статические методы для администрирования очередей: Create, Delete, Exists, Purge.
  • Методы поиска общих очередей: GetPublicQueues, GetPublicQueuesByLabel и другие. При их использовании можно создать приложение, которое переключается между несколькими менеджерами очередей в пределах Active Directory, если один из них выходит из строя.
  • Методы для работы с сообщениями (Send, Receive, Peek и другие), в том числе позволяющие использовать обработчик на завершение операции (BeginPeek, BeginReceive).

При применении классов из System.Messaging возможно три варианта работы с очередями сообщений:

  • работа с очередями, не использующими транзакции;
  • работа с очередями, поддерживающими транзакции, при использовании внутренних транзакций MSMQ;
  • работа с очередями, поддерживающими транзакции, при использовании распределенных транзакций COM+.

Определенной трудностью при использовании MSMQ в .NET Framework являются различия по использованию разных видов очередей. В частности, для очередей без транзакций можно установить обработчик на завершение приема сообщения, а для очередей с транзакциями этот способ неприемлем, поскольку само чтение сообщения должно быть оформлено как часть транзакции. Для обоих видов очередей можно поставить обработчик на появление сообщения в очереди, что и является рекомендованным способом.

Для сериализации и десериализации сообщений MSMQ могут использоваться классы XMLMessageFormatter или BinaryMessageFormatter из пространства имен System.Messaging. Класс XMLMessageFormatter использует класс System.Xml.Serialization.XmlSerializer, описанный ранее в теме о сериализации, поэтому при использовании XMLMessageFormatter должны учитываться все особенности использования класса XmlSerializer. Класс BinaryMessageFormatter аналогичным способом использует для сериализации класс BinaryFormatter.

Поскольку классы BinaryFormatter и XmlSerializer имеют различные ограничения на сериализуемые классы и используют совершенно различные процедуры сериализации, в нетривиальном случае переход BinaryMessageFormatter на XMLMessageFormatter или наоборот может привести к определенным изменениям в исходном коде программных компонент.


Начало  Назад  Вперед