RabbitMQ从c#解析“client_properties”头

问题描述 投票:1回答:1

我正在通过事件插入来监听连接更改(“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>>}
java c# parsing rabbitmq
1个回答
0
投票

显然(至于我在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。

我希望这可以帮助别人 :)

© www.soinside.com 2019 - 2024. All rights reserved.