我正在通过事件插入来监听连接更改(“amq.rabbitmq.event”,“connection。#”)。
它正常工作,所以我在java端添加了两个额外的参数作为clientproperties,以获取连接或断开连接的用户的身份。
但是在c#侧我只能将这些属性作为byte []的列表来访问,并且不确定如何将它转换为Dictionary等等。
如果我打印所有条目
if (args.BasicProperties.Headers.TryGetValue("client_properties", out object value))
{
var items = value as List<object>;
foreach(var item in items)
{
Console.WriteLine($"{item.GetType().ToString()}");
var bytes = item as byte[];
result.Add(Encoding.UTF8.GetString(bytes));
}
}
我可以看到这个:
{<<"platform">>,longstr,<<"Java">>}
{<<"capabilities">>,table,[{<<"connection.blocked">>,bool,true},{<<"basic.nack">>,bool,true},{<<"exchange_exchange_bindings">>,bool,true},{<<"authentication_failure_close">>,bool,true},{<<"publisher_confirms">>,bool,true},{<<"consumer_cancel_notify">>,bool,true}]}
{<<"groupId">>,longstr,<<"1e6e935f0d4d9ec446d67dadc85cbafd10d1a095">>}
{<<"information">>,longstr,<<"Licensed under the MPL. See http://www.rabbitmq.com/">>}
{<<"version">>,longstr,<<"4.8.1">>}
{<<"copyright">>,longstr,<<"Copyright (c) 2007-2018 Pivotal Software, Inc.">>}
{<<"product">>,longstr,<<"RabbitMQ">>}
什么样的对象格式是什么,我该如何解析它?:
{<<id>>,type,<<value>>}
显然(至于我在Rabbit客户端谷歌小组得到的这个问题的答案),client_properties是不会被接收方读取的东西。
然而,这是一个非常好的方式来获得像LWT(遗嘱和遗嘱)之类的东西,然后我会在我自己解析时使用它。
if (args.BasicProperties.Headers.TryGetValue("client_properties", out object value))
{
var items = value as List<object>;
foreach (var item in items)
{
var bytes = item as byte[];
//{<<id>>, type, <<value>>}
String itemStr = Encoding.UTF8.GetString(bytes);
var parts = itemStr.Split(",");
var key = CleanErlangString(parts[0]);
var value = CleanErlangString(parts[2]);
// Do things with key/value
}
}
ClearErlangFunction
private static string CleanErlangString(string toClean)
{
return toClean
.Replace("{", "").Replace("}", "")
.Replace("\"", "")
.Replace("<<", "").Replace(">>", "");
}
我正在做什么来使用它作为LWT,在客户端设置自定义属性,然后在“amq.rabbitmq.event”,“connection。#”读取事件时获取它。有了这个,我知道谁已断开连接,甚至用我的核心服务器处理LWT。
我希望这可以帮助别人 :)