java - NServiceBus 和 Java 集成

标签 java c# rabbitmq nservicebus

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

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

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

  1. 我可以看到它应该将消息发送到正确的队列。该名称已在 RabbitMQ 管理工具中进行验证。但该队列中没有任何 Activity 。

  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# 客户端不对消息使用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 messageserrors每个端点。这将允许您确定 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/

相关文章:

java - InvalidKeySpecException : How do I extract a private key from a . 文件?

C#:长路径与 UseLegacyPathHandling 和 BlockLongPaths 不起作用

c# - 在 XNA 中对网格进行排序

node.js - 带有 NodeJS 的 RabbitMQ - 使用 amqplib 获取消息计数

java - SpringBootTest 正在连接数据库

java - jsp中的表单,用什么代替隐藏字段

java - 生菜RedisCodec数字

c# - 为什么 StringBuilder.AppendLine 不添加带有某些字符串的新行?

rabbitmq - RabbitMQ 客户端如何判断它何时失去与服务器的连接?

javax.jms.JMSException : An existing connection was forcibly closed by the remote host