WinForms RabbitMQ编码无法正常工作

qxsslcnc  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(135)

我正在制作一个从队列接收RabbitMQ消息的应用程序,但是编码不能正常工作。
下面是我的消息(JSON格式)的外观:

{
    "deviceId": 1234,
    "message": "{\"message\":\"This is a message\"}",
    "sentEpoch": 12345,
    "type": "UPDATE"
}

这是处理接收消息的代码:

consumer.Received += async (model, ea) =>
            {
                var receivedEpoch = await _epochService.GetEpochFromAPI();
                var body = ea.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
            };

这与RabbitMQ tutorial中的用法相同。
现在来看看实际的问题。当我向队列中添加一条消息,然后启动应用程序时,message将如预期的那样:

{
    "deviceId": 1234,
    "message": "{\"message\":\"This is a message\"}",
    "sentEpoch": 12345,
    "type": "UPDATE"
}

但是,当我在WinForms应用程序已经运行的情况下向队列中添加消息时,它有时(我似乎找不到模式)会在解码时出现如下字符串,而不是预期的JSON:

"\u0017\u0003\u0003\0{\0\0\0\0\0\0\0D�\u0383,�*J���ߟ��<�9�˪b5\u0001Ռ\u0016\u001d�ѷ\u0004\u0018��]y�\u0004T̛x��Ȁ_\u0018�\u0010�\u001e(�n�ל\u0012�/z;\u007f��aP=��\t\u0010.�Dz���`��6�6XC�\u0018��Q,<HB�\u000e��v�\tH>�Ȅ���\u0012\u0001�DATE\"}"

很明显,我不能反序列化这个字符串。但奇怪的是,当我重新启动WinForms应用程序并侦听新消息时,上面的消息将解码为预期的JSON。
我真的不能把一个手指上的问题,希望有人能指出我在正确的方向。如果你需要更多的信息,让我知道!

更新

现在,我尝试直接在RabbitMQ的管理 Jmeter 板中发布消息,结果仍然是一样的。
我还尝试在编码周围放置一个while循环,只是为了检查是否每次都将相同的消息编码为相同的字符串,它确实如此。
我在3个节点上使用仲裁队列,并结合持久消息和持久队列。

vql8enpb

vql8enpb1#

我不知道它为什么会这样,但它和
var receivedEpoch = await _epochService.GetEpochFromAPI();
如果我将代码更改为

consumer.Received += async (model, ea) =>
            {
                var receivedEpoch = _epochService.GetEpochFromAPI();
                var body = ea.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                receivedEpoch = await receivedEpoch;
            };

它不再显示奇怪的消息,一切都按预期工作。如果有人知道为什么它这样工作,让我知道。

相关问题