Очередь сообщений с различными типами сообщений
Я исследую очереди сообщений Microsoft для выполнения межпроцессных сообщений между процессами. Но когда я получаю сообщение, Я не знаю априори тип объекта я получаю, поэтому код
queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Wibble) });
невозможно применить до Я получаю сообщение, потому что я не знаю, если это Wibble. Так как я получаю разные типы сообщений?
4 ответов
вы можете не хранить свой объект в сообщении MSMQ, а вместо этого поместить ссылку на его постоянное местоположение, если сможете. MSMQ имеет конечное пространство в очередях сообщений, поэтому лучше всего использовать меньшие сообщения.
Если вы не можете этого сделать, вы можете сериализовать свой объект в BodyStream сообщений напрямую, используя любой сериализатор, который вам нравится. Затем сохраните имя типа, возможно, лучше всего в метке сообщения.
что-то очень похожее на это (почесал его здесь нет IDE на этом компьютере), чтобы положить его, и analagous действие на выходе:
public void FormatObject(object toFormat, Message message)
{
var serializer = new XmlSerializer(toFormat.GetType());
var stream = new MemoryStream();
serializer.Serialize(toFormat, stream);
//don't dispose the stream
message.BodyStream = stream;
message.Label = toFormat.GetType().AssemblyQualifiedName;
}
вы уже используете перегрузку конструктора для XmlMessageFormatter
принимает массив типов. Так что просто добавьте все типов, которые вы ожидаете получить в этот массив, а не только один тип.
queue.Formatter = new XmlMessageFormatter(new Type[] {
typeof(Wibble),
typeof(Fleem),
typeof(Boo)
});
С TargetTypes
:
экземпляр, сериализованный в теле сообщения, должен соответствовать одним из схемы, представленные в массиве типов. Когда вы читаете сообщение с помощью метода Receive метод создает объект типа, соответствующего идентифицированной схеме, и считывает в него тело сообщения.
(Курсив)
существует большое количество дезинформации работает вокруг на MSMQ в первую очередь потому, что документация Microsoft пугающе разрежена о том, как правильно создать сообщение отправить получить. У меня есть обе книги MSMQ, опубликованные на эту тему, и я все еще ищу разумные проекты в интернете.
таким образом, ни одна из этих ссылок не говорит, что существует один тип сообщения для требования очереди. И что бы сделать PeakMessage и вариантов ненужные и даже глупые. Microsoft расплывчата и сложна в своей документации, но я работал там, и они никогда не глупы.
существует постоянное раздражающее предложение использовать CLSID в качестве идентификатора, практика, которая раздражающе близорука. Как насчет попытки внедрить тип сообщения в метку??? Затем используйте PeadMessage для запуска очереди до тех пор, пока не найдете сообщение, предназначенное специально для вашей конкретной очереди и с типом сообщения, которое можно использовать для форматирования свойств сообщения для получения сообщение правильно с первой попытки???
Я знаю, что это делает для сложного набора кода, но вы бы предпочли обойтись без? Или вы действительно попытаетесь реализовать предложение ответчика выше, который подразумевает, что если у вас есть система из 200 пользователей с 200 типами сообщений, они должны создать 80 000 очередей для управления всеми требованиями один к одному? Некоторые люди просто не продумывают все до конца.
As joocer примечания в комментарии: используйте другую очередь для разных типов сообщений.
в качестве альтернативы вы можете согласиться с отправителями сообщений, что все сообщения будут XML (все, что не разбирается как XML, отклоняется). Затем также согласитесь с некоторыми основами схемы XML: элементом заголовка с типом сообщения (и версией).
затем обработать (либо самостоятельно через сериализатор) во внутренний тип.
конечно, во многих случаях – там, где нет реальной пользы от десериализации – просто прочитайте содержимое XML по мере необходимости.