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


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


Рекомендованным для использования с MSMQ следует считать XMLMessageFormatter. Его применение позволяет создать XSD схему для передаваемого сообщения. При использовании MSMQ ни значительно меньший объем сообщения, создаваемого классом BinaryMessageFormatter, ни его меньшее время работы не является принципиальными факторами.

Ниже рассмотрено вспомогательное пространство имен с классами общего вида, реализующими модель "запрос-ответ" при использовании внутренних транзакций MSMQ (рис. 5.2).

Обслуживание запросов клиентов при использовании MSMQ

Рис. 5.2.  Обслуживание запросов клиентов при использовании MSMQ

Программа использует пространство имен с классами передачи сообщений System.Messaging и пространство имен с коллекциями общего вида.

using System; using System.Messaging; using System.Collections.Generic;

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

namespace Seva.Msmq { // типы очередей enum QueueType {NonTransactional, Transactional}; // типы классов форматирования enum QueueFormatter {Binary, Xml}; // делегат общего вида для обработки сервером сообщений клиента delegate AnswerType ProcessRequestEventHandler <RequestType, AnswerType>(Object sender, RequestType request, MessageQueue queueResponse); // делегат общего вида для обработки ответов сервера клиентом delegate void ProcessAnswerEventHandler<RequestType, AnswerType> (Object sender, RequestType request, AnswerType answer);

Абстрактный класс MSMQUser, наследуемый классами MSMQServer и MSMQClient.

public abstract class MsmqUser { // использование восстанавливаемых сообщений private bool recoverable = false; public bool Recoverable { get { return recoverable; } set { recoverable = value; } } // объекты форматирования для посылки приема сообщений protected IMessageFormatter requestFormatter; protected IMessageFormatter answerFormatter; // public MsmqUser(QueueFormatter formatterType) { if (formatterType == QueueFormatter.Xml) { requestFormatter = new XmlMessageFormatter( new Type[]{typeof(RequestType)}); answerFormatter = new XmlMessageFormatter( new Type[]{typeof(AnswerType)}); } if (formatterType == QueueFormatter.Binary) { requestFormatter = new BinaryMessageFormatter(); answerFormatter = new BinaryMessageFormatter(); } } } Листинг 5.1.

Класс общего вида, посылающий через MSMQ запросы и получающий ответы на них.




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