Как подготовить консольное приложение, которое выдвигает и помещает в очередь redis? - PullRequest
1 голос
/ 18 июня 2019

Мне нужно подготовить консольное приложение с 3 кнопками, одну, которая добавляет элементы в очередь Redis, одну, которая выталкивает элементы из нее, и одну, которая отображает элементы в очереди.Я новичок в C # и Redis.Может ли кто-нибудь помочь мне с этим, или предоставить мне некоторые ресурсы.

Я закодировал соединение с БД Redis и могу устанавливать и получать переменные.

using System;
using StackExchange.Redis;
namespace RedisConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            ConnectionMultiplexer redisCon = ConnectionMultiplexer.Connect("localhost");
            IDatabase db = redisCon.GetDatabase();
            //db.Lis
            db.StringSet("foo", "dog");
            string val = db.StringGet("foo");
            Console.WriteLine("output is {0}", val);
            Console.ReadKey(); 
        }
    }
}

1 Ответ

0 голосов
/ 18 июня 2019

Напишите такому подписчику канала

public class RedisHostingRunner : HostedService
{
    private readonly IServiceProvider _serviceProvider;
    IRedisSubscriber _subscriber;

    public RedisHostingRunner(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
        _subscriber = _serviceProvider.GetRequiredService<RedisSubscriber>();
    }

    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    {
        //while (!cancellationToken.IsCancellationRequested)
        //{
            _subscriber.SubScribeChannel();
            //await Task.Delay(TimeSpan.FromSeconds(60), cancellationToken);
        //}
    }

    public Task ShutdownAsync(CancellationToken cancellationToken = default)
    {
        return Task.CompletedTask;
    }
}

И в вашем подписчике установите обработчик сообщений

    public void SubScribeChannel()
    {
        _logger.LogInformation("!SubScribeChannel started!!");

        string channelName = _config.ActiveChannelName;
        var pubSub = _connectionMultiplexer.GetSubscriber();
        try
        {
            pubSub.Subscribe(channelName, async (channel, message) => await MessageActionAsync(message, channel));
        }
        catch(Exception ex)
        {
            _logger.LogInformation(String.Format("!error: {0}", ex.Message));
        }
        Debug.WriteLine("EOF");
    }

В своем обработчике сделайте свою работу

    private async Task MessageActionAsync(RedisValue message, string channel)
    {
        try
        {
            Transformer t = new Transformer(_logger);
            _logger.LogInformation(String.Format("!SubScribeChannel message received on message!! channel: {0}, message: {1}", channel, message));
            string transformedMessage = Transformer.TransformJsonStringData2Message(message);
            List<Document> documents = Transformer.Deserialize<List<Document>>(transformedMessage);

            await MergeToMongoDb(documents, channel);
            _logger.LogInformation("!Merged");
        }
        catch (Exception ex)
        {
            _logger.LogInformation(String.Format("!error: {0}", ex.Message));
        }
    }
...