rabbitmq NServiceBus和Java集成

b5buobof  于 2023-08-05  发布在  RabbitMQ
关注(0)|答案(1)|浏览(146)

我们有几个微服务,其中大部分是用C#编写的,但有一个是用Java编写的。我们使用NServiceBus和RabbitMQ来实现.NET服务之间的通信。我们有一个案例,其中一个C#组件需要通过RabbitMQ与Java组件进行请求/回复。
当使用NServiceBus时,应答队列被标记为AnyQueueName-1,其中-1表示这是一个应答队列。
通过调试Java服务,我可以看到我能够将消息从C#服务发送到Java服务。一旦Java组件完成了对消息的处理,它就应该发送回一个消息。这就是所有问题的开始。
1.我可以看到它应该将消息发送到正确的队列。该名称已在RabbitMQ管理工具中验证。但此队列中没有活动。

  1. Java端没有抛出异常,因此看起来它能够发送消息,但是它去了哪里呢?我并不期望NServiceBus和Java能够完美地协同工作,但至少我应该在预期的队列中看到一些活动。
    相关的Java代码如下所示:
Message responseMessage =
    rabbitTemplate.getMessageConverter().toMessage(
        response, responseProperties);

String replyTo = requestProperties.getReplyTo();
rabbitTemplate.convertAndSend(replyTo, responseMessage, cd);

字符串
变量replyTo是我希望将消息推送到的队列的名称。
谁能给予我一个正确的方向推吗?下一步应该在哪里调试?
谢谢你,谢谢

8hhllhi2

8hhllhi21#

如果不实际访问基础架构,则很难识别此问题。
在我看来,考虑到你的Java客户端成功地发布到RabbitMQ代理,但C#客户端没有对消息做出React,你的消息序列化可能缺少了一些东西。
下面是一些你可以检查的东西。

查看原生集成RabbitMQ示例

NServiceBus文档中有一节介绍了如何使用native RabbitMQ integration。您可以下载示例,看看特定的家伙是如何让它工作的。

NServiceBus消息头

NServiceBus在消息中使用特定的头属性。其中之一是NServiceBus.EnclosedMessageTypes头,它允许NServiceBus识别消息类型。更具体地说,这个头允许NServiceBus将消息Map到实现IMessage的相应C#类。此外,还需要NServiceBus.MessageIntent报头。
我建议您查看NServiceBus Message Headers文档-特别是在您的情况下,Reply Headers部分。确保您从Java客户端添加了NServiceBus所需的头文件,如RabbitMQ API-Guide中所述。我不知道NServiceBus必须使用哪些头文件,所以尝试和错误是您的好朋友。

在RabbitMQ中跟踪NServiceBus发布的消息

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

使用NServiceBus ServiceControl

NServiceBus的优势之一是它附带的工具。设置一个ServiceControl示例,并使用ServiceInsights应用程序检查每个端点的消息和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请求发送消息。

相关问题