Ребус помещает странные символы в JAD-словарь HEADER, написанный в MSMQ Extension Property
У меня есть приложение, которое пишет сообщение с использованием шаблона публикации / подписчика с реализацией Rebus. В какой-то момент, без каких-либо изменений кода, Ребус начал писать двоичное содержимое Расширения MSMQ с некоторыми странными символами после содержимого JSON, вот пример одного принятого сообщения с проблемой:
{ "Rbs2-намерения":"паб","rbs2-сообщ-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-возвратного адрес":"myqueuename@SERVERNAME","rbs2-senttime":"2018-04-26T00:20:48.0453055-03:00","rbs2-корр-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-корр-сл":"0","rbs2-msg-type":"ClassNamespace.BusinessClassName, ClassNamespace","rbs2-content-type":"application/json;charset=utf-8","rbs2-content-encoding":"gzip"}?k? ч?3??? / Мас??
Вот полное сообщение об ошибке, которое я получаю в лог-файле lof4net, написанное Rebus при получении сообщения от MSMQ.
2018-05-03 10: 33: 49,516 WARN Rebus.Workers.ThreadPoolBased.ThreadPoolWorker - Произошла ошибка при попытке получить следующее сообщение: System.Runtime.Serialization.SerializationException: Не удалось десериализовать текст JSON '{"rbs2-intent":"паб","rbs2-сообщ-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-возвратного адрес":"myqueuename @ SERVERNAME","rbs2-senttime":"2018-04- 26T00: 20: 48.0453055-03: 00","rbs2-корр-идентификатор":"ac543d60-e28c-49bb-8783-b5c6574a90ea","rbs2-корр-сл":"0","rbs2-тзд типа":"ClassNamespace.BusinessClassName, ClassNamespace","rbs2-content-type":"application / json; charset = utf-8","rbs2-content-encoding":"gzip"}? K? H?3??? /?? W R?? Newtonsoft.Json.JsonReaderException: дополнительный текст, встречающийся после завершения чтения содержимого JSON: . Path '', строка 1, позиция 432. в Newtonsoft.Json.JsonTextReader.Read() в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(считыватель JsonReader, тип objectType, логический checkAdditionalContent) в Newtonsoft.Json.JsonSerializer.Deserializer читатель, введите objectType) в Newtonsoft.Json.JsonConvert.DeserializeObject(строковое значение, тип Type, настройки JsonSerializerSettings) в Newtonsoft.Json.JsonConvert.DeserializeObject[T](строковое значение, настройки JsonSerializerSettings) в Rebus.Serializer.Stringize.Dring String str) --- Конец внутренней трассировки стека исключений --- в Rebus.Serialization.HeaderSerializer.DeserializeFromString(String str) в Rebus.Msmq.MsmqTransport.d__15.MoveNext() --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача) в Rebus.Workers.ThreadPoolBased.ThreadPoolWorker.d__17.MoveNext()
Через некоторое время, углубившись в эту проблему, мне удалось выполнить дизассемблирование реализации Rebus для класса MSMQ "MsmqTransport", и я смог увидеть, как Rebus взаимодействует с MSMQ, а также как свойство Extension заполняется двоичными данными Encoding.UTF8.GetBytes.
Что мне не понятно, так это как Encoding.UTF8.GetBytes(JsonConvert.Serialize(Dictionary<string,string>))
может привести к тому, что испортил массив байтов.
Я полагаю, что на эту реализацию Rebus MsmqTransport для MSMQ не может повлиять мой код, ни объект, который я отправляю в MSMQ, в котором он будет размещен в теле сообщения, а не в двоичном расширении, или, как я м его настраиваю.
В качестве обходного пути, чтобы все решения работали, я реализовал сервис, в котором просматривает сообщение из MSMQ, выполняет байты свойства Encoding.UTF8.GetString из Exteions, анализирует его, исправляет его в случае странных символов и извлекает он возвращается (исправный JSON) в свойство Extension, затем удаляет его из MSMQ и возвращает его обратно в MSMQ, поэтому реальный процесс, использующий Rebus (подписчик), сможет получить его должным образом.
Есть ли способ узнать, как Ребус портит двоичные данные, записанные в свойстве Extension сообщения MSMQ!?
Вот как я настраиваю Rebus при реализации Publisher:
Bus = Configure.With(activator)
.Logging(l => l.Trace())
.Options(o =>
{
o.SimpleRetryStrategy(Config.ErrorQueue, Config.MaxDeliveryAttempts == 0 ? 3 : Config.MaxDeliveryAttempts);
if (Config.EnableCompression)
o.EnableCompression();
})
.Transport(t => t.UseMsmq(Config.PublisherQueue))
.Subscriptions(s => s.Register(c => SubscriptionStorage))
.Start();
Большое спасибо.
1 ответ
Это звучит очень странно!
Как вы правильно поняли, то, как Ребус заполняет Extension
собственность MSMQ Message
не оставляет столько места для странных ошибок и забавного поведения, как то, что вы испытываете.
Однажды я использовал Rebus на сайте клиента, и в течение долгого времени все работало нормально, но внезапно, даже без каких-либо изменений кода, странные вещи начали появляться в Extension
часть наших сообщений MSMQ тоже очень похожа на то, что вы видите.
После долгих размышлений и потрясений мы выяснили, что наш заказчик нанял другую компанию, чтобы помочь им с общим мониторингом производительности и прочим, и одна из их инициатив заключалась в том, чтобы использовать Extension
свойство сообщений MSMQ, связанное с заголовками Ребуса, тем самым нарушая все.
Я не знаю, является ли это "стандартной практикой MSMQ", или почему они просто начинают портить наши сообщения, даже не спрашивая нас, будет ли это проблемой, но, может быть, это может быть чем-то похожим в вашем случае?
Если нет, у меня нет никаких улик.