NServiceBus 和 Java 集成

NServiceBus and Java integration

我们有几个微服务,其中大部分是用 C# 编写的,但有一个是用 Java 编写的。我们使用 NServiceBus 和 RabbitMQ 在 .NET 服务之间进行通信。我们有一个案例,其中一个 C# 组件需要通过 RabbitMQ 与 Request/Reply 组件通信。

当使用 NServiceBus 时,回复队列被标记为 AnyQueueName-1,其中 -1 表示这是一个回复队列。

调试 Java 服务,我可以看到我能够将消息从 C# 服务发送到 Java 服务。一旦 Java 组件处理完消息,它应该发回消息。这是所有问题开始的地方。

  1. 我可以看到它应该将消息发送到正确的队列。该名称已在 RabbitMQ 管理工具中验证。但是这个队列中没有活动。

  2. Java 端没有抛出异常,在我看来这似乎可以发送消息,但它去哪儿了?我不希望 NServiceBus 和 Java 能完美地协同工作,但至少我应该在我预期的队列中看到一些 activity。

相关的 Java 代码如下所示:

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

其中变量 replyTo 是我希望将消息推送到的队列的名称。

任何人都可以在正确的方向上推动我吗?接下来我应该在哪里调试?

谢谢!

如果不实际访问基础架构,则很难识别此问题。

在我看来,考虑到您的 Java 客户端成功发布到 RabbitMQ 代理,但 C# 客户端没有对消息做出反应,您的消息序列化可能遗漏了一些东西。

您应该检查的几件事:

看一下与 RabbitMQ 的本机集成示例

NServiceBus 文档有一节介绍如何使用 native RabbitMQ integration。 您可以下载示例并查看特定人员如何使其工作。


NServiceBus 在消息中使用特定的 header 属性。

其中一个是 NServiceBus.EnclosedMessageTypes,它允许 NServiceBus 识别消息类型,更具体地说,将其映射到相应的 C# class 实现 IMessage。还需要 NServiceBus.MessageIntent header。

我建议您查看 NServiceBus Message Headers documentation, in your case specially the Reply Headers section. Make sure you add the NServiceBus required headers from your Java client as explained in the RabbitMQ API-Guide。我不知道 NServiceBus 必须使用哪些 header 才能工作,所以试错是你的朋友。


跟踪 NServiceBus 在 RabbitMQ 中发布的消息

将使用 NServiceBus 发布的消息与使用 Java 客户端发布的消息进行比较。这是一个 link 的关于如何跟踪 RabbitMQ 消息及其负载的可能解决方案。这样您就可以识别两种消息类型及其内容之间的差异。


使用NServiceBus ServiceControl

NServiceBus 的优势之一是它带来的工具。为每个端点设置一个 ServiceControl and use the ServiceInsights to check messages and errors 实例。您可能会发现您的 Java 消息已被收听。 一般来说,这个工具非常适合生产环境,我只能推荐它。


如果没有任何效果,您的另一个选择是在 C# 中创建一个苗条的 REST API 作为发布者网关,它将接受 POST 请求,并且使用 NServiceBus 将内容发布到您的 RabbitMQ。您将能够引用包含您的消息的项目,并将它们用作 API.

的模型

一个可能的例子:

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

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

这样您的 Java 客户端将使用 http 请求发送消息。