.net Apache NMS IBytesMessage在出列后具有前缀

mdfafbf1  于 2022-11-26  发布在  .NET
关注(0)|答案(1)|浏览(102)

我已经尽了最大的努力来解决这个问题,但是我想我对Dotnet/C#和消息队列的缺乏经验正在显现出来。

问题

简而言之,我现在处理的情况是,我有两个项目。

first项目是一个遗留的Dotnet项目,它使用Apache NMS库来使用ActiveMQ队列中的消息。

队列通常在生产中通过SSL连接,但在本地开发时,我通过TCP连接,所有工作正常,并按预期主动连接和出列。
消息出队后,将使用JsonConvert DeserializeObject方法对它们进行反序列化。

第二个项目是一个NodeJS项目,我创建它是为了将消息放到队列中。

消息只是一个简单的对象,字符串化为JSON。
我使用AMQP Rhea npm package连接并发送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;
    }

以下是前缀:

\0SpE\0SsE\0Sw\xb1\0\0\x01\xac{"Message":"Message Content Snipped for Brevity"}

它看起来总是一样的,所以也许它对某人有意义。

我的尝试和期望

为了快速调试,我尝试使用AMQP连接到Dotnet项目中的队列,但Apache NMS包似乎不支持此功能。
我也不能完全重写与另一个包的连接。
我也写了一些东西来在我的节点应用程序中出列消息,我得到了没有前缀的JSON,但这与AMQP协议有关,这可能是为什么?
谢谢你的帮助
编辑:我应该补充一点,我使用的是ActiveMQ Classic,而不是Artemis。

2ic8powd

2ic8powd1#

回答我自己的问题,这似乎是一个问题,与amqp/瑞亚包和使用AMQP协议,因为我怀疑。
问题在于,来自队列的消息已经被编码,并且消息主体包括该编码,这一点我无法详细解释。
NMS库使用ActiveMQ的本机OpenWire协议。
我可能不得不通过从使用amqp/reha包转移到尝试找到一个等效的openwire包来解决这个问题-这比尝试为Dotnet项目找到一个等效的AMQP包更好。

编辑:

事实证明,reha包足以解决这个问题。在发送消息体时,我将其创建为Buffer而不是Message类型:

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

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

相关问题