我正在制作一个从队列接收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个节点上使用仲裁队列,并结合持久消息和持久队列。
1条答案
按热度按时间vql8enpb1#
我不知道它为什么会这样,但它和
var receivedEpoch = await _epochService.GetEpochFromAPI();
如果我将代码更改为
它不再显示奇怪的消息,一切都按预期工作。如果有人知道为什么它这样工作,让我知道。