Apache NMS IBytesMessage在脱队列后有一个前缀



我已经尽力弄清楚了,但是我猜我在Dotnet/c#和消息队列方面的经验不足。

概括地说,我正在处理的情况是,我有两个项目。

首先项目是一个遗留的Dotnet项目,使用Apache NMS库从ActiveMQ队列中消费消息。

队列通常在生产中通过SSL连接,但在本地开发时,我通过TCP连接,所有工作正常,并积极连接&按预期退出队列。

一旦消息被脱队列,它们将使用JsonConvert DeserializeObject方法进行反序列化。

第二project是我创建的一个NodeJS项目,用于将消息放到队列中。

消息只是一个简单的对象,字符串化为JSON。

我正在使用AMQP Rhea npm包来连接和发送消息,以AMQP格式。

这一切都工作正常,消息按预期进入队列。

问题是当我对从队列中取出的消息进行反序列化时。

有一个异常,因为它遇到了我的JSON消息的前缀-我不知道前缀来自哪里。

我隐约怀疑这是因为我正在使用的协议之间存在冲突,这导致了问题,但在我发现自己陷入那个特殊的兔子洞之前-或者只是诉诸于使用不可靠的方法删除前缀-我希望你们中有一个更有经验的人可以帮助我指出正确的方向。


下面是一些有问题的c#代码片段:

这是我如何去排队的消息:


string dequeuedMessage = string.Empty;
List<string> messages = new List<string>();
IMessage message = _consumer.Receive(waitForMessage);
if (message is ITextMessage || message is IBytesMessage)
{
dequeuedMessage = (message is ITextMessage) ? (message as ITextMessage).Text : Encoding.UTF8.GetString((message as IBytesMessage).Content);
messages.Add(dequeuedMessage);
}
else
break;

有趣的是消息总是作为IBytesMessage类型出现,而不是前面作者所期望的(ITextMessage),这就是为什么我有这种隐约的怀疑。

我是这样反序列化消息的:

private IMessage BuildMessageObject(string message)
{
IMessage convertedMessage = JsonConvert.DeserializeObject<QueueMessage>(message);

return convertedMessage;
}

看一下前缀:

SpESsESwxb1x01xac{"Message":"Message Content Snipped for Brevity"}

它似乎总是一样的,所以它可能对某人意味着什么。

What I've try &预期

为了快速调试,我尝试使用AMQP连接到Dotnet项目中的队列,但似乎Apache NMS包不支持这个。

我也不能完全重写与另一个包的连接。

我还写了一些东西来在我的Node应用程序中取消消息队列,我得到JSON返回没有前缀,但这与AMQP协议连接,这可能是为什么?

Thanks forany帮助。

编辑:我应该补充一下,我使用的是ActiveMQ Classic而不是Artemis。

回答我自己的问题,它似乎是amqp/rhea包和使用amqp协议的问题,正如我所怀疑的。

问题是,如果没有详细说明,我无法完全解释,来自队列的消息已被编码,并且消息体包含该编码。

NMS库使用ActiveMQ的原生OpenWire协议。

我可能要解决这个问题,从使用amqp/rhea包,并试图找到一个开放线等效-这比试图找到一个amqp等效的Dotnet项目更好。

编辑:

事实证明,rhea包足以解决这个问题。在发送消息正文时,我将其创建为Buffer而不是message:

类型
const messageAsBuffer = Buffer.from(message);
sender.send(messageAsBuffer, undefined, 1);

其中undefined可以是消息标记,1可以是不为0的任意整数,指定消息不是AMQP格式。

最新更新