首页 > 解决方案 > NServiceBus 和 Java 集成

问题描述

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

当使用 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是我希望将消息推送到的队列的名称。

谁能给我推动正确的方向?接下来我应该在哪里调试?

谢谢!

标签: javac#rabbitmqnservicebus

解决方案


如果没有实际访问基础设施,这个问题很难识别。

在我看来,考虑到您的Java客户端已成功发布到RabbitMQ代理,但C#客户端没有对消息做出反应,您的消息序列化可能会丢失某些内容。

您应该检查的几件事:

看一下与 RabbitMQ 的原生集成示例

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


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

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

我建议您查看NServiceBus 消息标头文档,在您的情况下特别是回复标头部分。确保按照RabbitMQ API-Guide中的说明从客户端添加NServiceBus所需的标头。我不知道哪些标头是 NServiceBus 工作所必需的,所以反复试验是你的朋友。Java


在 RabbitMQ 中跟踪 NServiceBus 发布的消息

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


使用 NServiceBus 服务控制

的优点之一NServiceBus是它带来的工具。设置ServiceControl的实例并使用它ServiceInsights来检查每个端点的消息错误。您可能会发现您的Java消息已被听取。一般来说,这个工具非常适合生产环境,我只能推荐它。


如果没有任何东西让它工作,你的另一个选择是创建一个 slim REST APIinC#作为发布者网关,它将接受POST请求并将使用的内容发布NServiceBus到你的RabbitMQ. 您将能够引用包含您的消息的项目并将它们用作 API 的模型。

一个可能的例子:

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

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

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


推荐阅读