我们有多个微服务,其中大部分是用 C# 编写的,但也有一个是用 Java 编写的。我们使用 NServiceBus 和 RabbitMQ 在 .NET 服务之间进行通信。我们有一种情况,其中一个 C# 组件需要通过 RabbitMQ 通过请求/回复与 Java 组件进行通信。
使用 NServiceBus 时,回复队列标记为 AnyQueueName-1,其中 -1 表示这是一个回复队列。
调试 Java 服务,我可以看到我能够将消息从 C# 服务发送到 Java 服务。一旦 Java 组件处理完消息,它就应该发回一条消息。这是所有问题开始的地方。
我可以看到它应该将消息发送到正确的队列。该名称已在 RabbitMQ 管理工具中进行验证。但该队列中没有任何 Activity 。
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# 客户端不对消息使用react,您的消息序列化可能会丢失某些内容。
以下是您可以检查的一些内容。
查看与 RabbitMQ 的 native 集成示例
NServiceBus 文档中有一节介绍如何使用 native RabbitMQ integration 。 您可以下载示例并查看特定人员如何使其工作。
NServiceBus 消息头
NServiceBus 在消息中使用特定的 header 属性。其中之一是 NServiceBus.EnheldMessageTypes
header ,它允许 NServiceBus 识别消息类型。更具体地说,此 header 允许 NServiceBus 将消息映射到实现 IMessage
的相应 C# 类。此外,还需要 NServiceBus.MessageIntent
header 。
我建议您检查NServiceBus Message Headers文档 - 特别是在您的情况下 Reply Headers部分。确保从 Java 客户端添加 NServiceBus
所需的 header ,如 RabbitMQ API-Guide 中所述。 。我无法判断 NServiceBus 必须使用哪些 header 才能正常工作,因此反复试验是您的 friend 。
跟踪 NServiceBus 在 RabbitMQ 中发布的消息
将使用 NServiceBus 发布的消息与使用 Java 客户端发布的消息进行比较。这是link有关如何跟踪 RabbitMQ 消息及其负载的一种可能的解决方案。这样您就可以识别两种消息类型及其内容之间的差异。
使用 NServiceBus 服务控件
NServiceBus 的优点之一是它附带的工具。设置 ServiceControl 的实例并使用 ServiceInsights 应用程序来 check messages和 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 请求发送消息。
关于java - NServiceBus 和 Java 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56034493/