我们有几个微服务,大多数是用C#编写的,但是有一个是用Java编写的。我们使用NServiceBus和RabbitMQ在.NET服务之间进行通信。有一种情况是,其中一个C#组件需要使用RabbitMQ请求/应答与Java对话。
当使用NServiceBus时,应答队列被标记为AnyQueueName-1,其中-1表示这是一个应答队列。
通过调试Java服务,我可以看到我能够将消息从C#服务发送到Java。一旦Java组件处理完消息,它就应该发送回一条消息。所有的问题都从这里开始。
相关的Java代码如下所示:
Message responseMessage = rabbitTemplate.getMessageConverter().toMessage(response, responseProperties);
String replyTo = requestProperties.getReplyTo();
rabbitTemplate.convertAndSend(replyTo, responseMessage, cd);其中变量replyTo是我期望将消息推送到的队列的名称。
有人能把我推到正确的方向吗?下一步我应该在哪里调试?
谢谢!
发布于 2019-05-11 06:56:09
如果不完全访问基础设施,就很难确定这个问题。
在我看来,考虑到您的Java客户机成功地向RabbitMQ代理发布,但是C#客户端对消息没有反应,您的消息序列化可能缺少了什么。
有几件事你应该检查一下:
看一下与RabbitMQ示例的本机集成
NServiceBus文档中有一个关于如何使用本地RabbitMQ集成的部分。你可以下载这个示例,看看特定的人是如何让它工作的。
NServiceBus在消息中使用特定的标头属性.
其中之一是NServiceBus.EnclosedMessageTypes,它分配NServiceBus以标识消息类型,更具体地将其映射到实现IMessage的相应C#类。此外,还需要NServiceBus.MessageIntent头。
我建议您查看NServiceBus消息头文档,特别是应答标头部分。确保您从您的NServiceBus客户机中添加了Java所需的头部,如RabbitMQ API-指南中所解释的。我不知道这些标头中哪些是NServiceBus必须运行的,所以尝试和错误是您的朋友。
跟踪由NServiceBus在RabbitMQ中发布的消息
将使用NServiceBus发布的消息与使用Java客户端发布的消息进行比较。下面是一个关于如何跟踪链接消息及其有效负载的可能解决方案的RabbitMQ。通过这种方式,您可以识别这两种消息类型及其内容之间的差异。
使用NServiceBus ServiceControl
NServiceBus的优点之一是它所带来的工具。设置一个ServiceControl实例,并将ServiceInsights用于每个端点的检查讯息和错误。您可能会发现您的Java消息被监听了。一般来说,这个工具对于生产环境是很好的,我只能推荐它。
如果不让它工作,另一种选择是在C#中创建一个瘦的C#,作为发布网关,它将接收POST请求,并使用NServiceBus将内容发布到RabbitMQ。您可以引用包含消息的项目,并将它们用作API的模型。
一个可能的例子是:
POST https://busgateway.corporate.com/api/{endpoint}/send/{messagetype}
body:
{
"property": "value",
"publisher": "java client"
}这样,您的Java客户端将使用http请求发送消息。
https://stackoverflow.com/questions/56034493
复制相似问题