StackExchange.Redis не получает соответствующий шаблон при получении делегата - PullRequest
0 голосов
/ 24 мая 2018

Я реализую signalR, который подается Pub / Sub of Redis.Для взаимодействия с Redis я использовал StackExchange.Redis-1.2.6.

Проблема здесь в том, что когда я подписываю шаблон на концентраторе signalR, я создаю группу с ConnectionId и темой, которая мне интересна, и делаю то же самое в Redis Pub / Sub.

Когда я получаю сообщение, мне нужно отследить и уведомить всех заинтересованных подписчиков, но проблема в том, что Redis не дает мне соответствующий шаблон, а опубликованную тему.

ВотПример кода:

        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
        ISubscriber sub = redis.GetSubscriber();

        RedisChannel channelWithLiteral = new RedisChannel("messages", RedisChannel.PatternMode.Literal);
        sub.Subscribe(channelWithLiteral, (channel, message) => 
        {
            Console.WriteLine($"Literal -> channel: '{channel}' message: '{message}'");
        });

        RedisChannel channelWithPattern = new RedisChannel("mess*", RedisChannel.PatternMode.Pattern);
        sub.Subscribe(channelWithPattern, (channel, message) => 
        {
            Console.WriteLine($"Pattern -> channel: '{channel}' message: '{message}'");
        });

        sub.Publish("messages", "hello");
        Console.ReadLine();

Вывод:

Литерал -> канал: «сообщения» сообщение: «привет»

Шаблон -> канал:'messages' message: 'hello'

Что я ожидал / нужно:

Literal -> channel: 'messages' message: 'hello'

Pattern -> channel: 'mess *' сообщение: 'hello'

Вкл. https://redis.io/topics/pubsub при использовании PSUBSCRIBE мы уведомляемся как об исходной теме, так и о сопоставленном шаблоне.

Вот пример:

enter image description here

Есть ли какой-нибудь способ на StackExchange.Redis получить совпавший шаблон?

1 Ответ

0 голосов
/ 07 июля 2019

Я открыл проблему на GitHub: RedisChannel не получает сопоставленный шаблон, когда я получаю делегата :

В настоящее время вы можете найти обходное решение.

" В настоящий момент единственный способ сделать это -" захватить "канал подписки при подписке. "

Вот обходной подход:

  1. Перед созданием делегата Action объявите временную переменную для хранения шаблона. В ссылке на делегат Action указана временная переменная

  2. Каждый раз, когда кто-то пытается подписаться, создаетсяновый экземпляр этой переменной и доставьте эту информацию вместе с каналом Redis

Вот пример кода:

public class MyTest
    {
        private readonly ISubscriber subscriber; 

        public MyTest()
        {
            ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
            this.subscriber = redis.GetSubscriber();
        }

        public void SubscribeWithPattern(string pattern)
        {
            RedisChannel channelWithPattern = new RedisChannel(pattern, RedisChannel.PatternMode.Pattern);
            string originalChannelSubcription = pattern;
            this.subscriber.Subscribe(channelWithPattern, (channel, message) =>
            {
                Console.WriteLine($"OriginalChannelSubcription '{originalChannelSubcription}");
                Console.WriteLine($"Channel: '{channel}");
                Console.WriteLine($"Message: '{message}'");
            });
        }

        public void Publish(string channel, string message)
        {
            this.subscriber.Publish(channel, message);
        }
    }
...