Очередь сообщений с различными типами сообщений

Я исследую очереди сообщений 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 по мере необходимости.