NServiceBus и интеграция Java - PullRequest
2 голосов
/ 08 мая 2019

У нас есть несколько микросервисов, большинство из которых написаны на C #, но один написан на Java.Мы используем NServiceBus и RabbitMQ для связи между сервисами .NET.У нас есть один случай, когда один из компонентов C # должен общаться с компонентом Java с помощью запроса / ответа через RabbitMQ.

При использовании NServiceBus Очередь ответов помечается AnyQueueName-1, где -1 указывает, что это Очередь ответов.

Отладка службы Java, я вижу, что я могуотправлять сообщения из службы C # в службу Java.Когда Java-компонент завершит обработку сообщения, он должен отправить сообщение обратно.Здесь начинаются все проблемы.

  1. Я вижу, что он должен отправить сообщение в правильную очередь.Имя было проверено в инструменте управления RabbitMQ.Но в этой очереди нет никаких действий.

  2. На стороне Java не возникает никаких исключений, которые, как мне кажется, могут посылать сообщение, но куда он девается?Я не ожидаю, что NServiceBus и Java будут отлично работать вместе, но по крайней мере я должен увидеть некоторую активность в моей ожидаемой очереди.

Соответствующий Java-код выглядит следующим образом:

Message responseMessage = rabbitTemplate.getMessageConverter().toMessage(response, responseProperties);
String replyTo = requestProperties.getReplyTo();
rabbitTemplate.convertAndSend(replyTo, responseMessage, cd);

Где переменная replyTo - это имя очереди, в которую я ожидаю, что сообщение будет отправлено.

Может кто-нибудь дать мне толчок в правильном направлении?Где я должен отладить дальше?

Спасибо!

1 Ответ

2 голосов
/ 11 мая 2019

Эту проблему трудно выявить без фактического доступа к инфраструктуре.

Мне кажется, учитывая, что ваш Java клиент успешно публикует посредник RabbitMQ, а C# клиент неНе реагируйте на сообщения, что в вашей сериализации сообщений может что-то отсутствовать.

Несколько вещей, которые вы должны проверить:

Взгляните на встроенную интеграцию с образцом RabbitMQ

В документации NServiceBus есть раздел о том, как использовать встроенную интеграцию RabbitMQ .Вы можете скачать образец и посмотреть, как отдельные парни заставили его работать.


NServiceBus использует определенные атрибуты заголовка в сообщениях.

Один из них - этоNServiceBus.EnclosedMessageTypes, который позволяет NServiceBus идентифицировать тип сообщения, более конкретно, сопоставить его с соответствующим классом C#, реализующим IMessage.Также потребуется заголовок NServiceBus.MessageIntent.

Я предлагаю вам ознакомиться с документацией Заголовки сообщений NServiceBus , в вашем случае специально с разделом Заголовки ответа .Убедитесь, что вы добавили NServiceBus требуемые заголовки из вашего Java клиента, как описано в RabbitMQ API-Guide .Я не могу сказать, какие из этих заголовков являются обязательными для работы NServiceBus, поэтому пробная версия и ошибка - ваш друг.


Отслеживание сообщений, опубликованных NServiceBus в RabbitMQ

Сравните сообщения, опубликованные с помощью NServiceBus, с сообщениями, опубликованными с помощью клиента Java.Вот ссылка для одного возможного решения о том, как отслеживать сообщения RabbitMQ и их полезную нагрузку.Таким образом, вы можете определить различия между двумя типами сообщений и их содержимым.


Использование NServiceBus ServiceControl

Одним из преимуществ NServiceBus является наличие инструментовэто приносит с этим.Установите экземпляр ServiceControl и используйте сообщения проверки от ServiceInsights до и с ошибками для конечных точек.Вы можете найти прослушанные сообщения Java.Как правило, этот инструмент отлично подходит для производственных сред, и я могу только рекомендовать его.


Если ничего не работает, другим вариантом для вас будет создание тонкого REST API в C#, так какшлюз издателя, который будет принимать запросы POST и публиковать контент, используя NServiceBus для вашего RabbitMQ.Вы сможете ссылаться на ваш проект, содержащий ваши сообщения, и использовать их в качестве моделей для API.

Возможный пример:

POST https://busgateway.corporate.com/api/{endpoint}/send/{messagetype}

body:
{
   "property": "value",
   "publisher": "java client"
}

Таким образом ваш клиент Java будет отправлять сообщенияиспользуя http запросы.

...