我试图在ServiceStack和RabbitMQ中为消息添加一些自定义逻辑。
似乎ServiceStack创建的队列在队列名称前面有一些难以辨认的字符,这使得很难按名称引用它们。例如(来自RabbitMQ管理工具的链接):
http://localhost:15672/#/queues/%2F/%E2%80%8E%E2%80%8Emq%3ATestRequest.inq
请注意队列名称前面加上%E2%80%8E%E2%80%8E 。虽然队列看起来像 mq:TestRequest.inq ,但似乎有一个不同的名称。我还检查了另一台机器,行为是一致的。我也怀疑路由密钥会以同样的方式受到影响。
但是,如果我手动创建这样的队列(据我所见,ServiceStack以类似的方式完成):
RabbitMqServer mqServer = new RabbitMqServer(connectionString: hostName, username: userName, password: password);
RabbitMqMessageFactory factory = (RabbitMqMessageFactory)MqServer.MessageFactory;
using (var mqClient = new RabbitMqProducer(factory))
{
var channel = mqClient.Channel;
string qName = new QueueNames(typeof(TestRequest)).In;
channel.QueueDeclare(qName, true, false, false, null);
}
创建的队列有一个"正常"没有额外字符的名称。 http://localhost:15672/#/queues/%2F/mq%3ATestRequest.inq
此外,似乎交换是使用预期的名称创建的。
我的问题:
如何强制ServiceStack创建队列而不附加这些字符?
OR
如何构造包含这些字符的队列名称?
<小时/> 修改
插入的字符似乎是从左到右的标记( ‎
或 \ u200e )。将这些字符预先添加到队列名称/路由键似乎可以完成工作。然而,这看起来相当hacky所以我想避免这样做。
答案 0 :(得分:2)
这可能在RabbitMQ的内部,可能取决于您使用的是AMQP还是STOMP。除了整页之外,这是一个:
如果/,%或非ascii字节在queuename,exchange_name或routing_key中,则它们每个都被替换为序列%dd,其中dd是该字节的十六进制代码。