RabbitMQ анализирует заголовок "client_properties" из c # - PullRequest
0 голосов
/ 18 декабря 2018

Я прослушиваю изменения соединения через подключение событий ("amq.rabbitmq.event", "connection. #").

Это работает правильно, поэтому я добавляю на стороне java два дополнительных параметра в качестве clientproperties, чтобы получить личность пользователя, который подключается или отключается.

Однако на стороне c # я могу получить доступ только к этимсвойства в виде списка байтов [], и не уверен, как преобразовать его в словарь или около того ..

Если я распечатаю все записи

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>>}

1 Ответ

0 голосов
/ 14 февраля 2019

Очевидно (что касается ответа, который я получил в клиентской группе Google 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 с моим главным сервером.

Надеюсь, это кому-нибудь поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...