如何使用stackexchange.redis发布到servicestack.redis消息队列?

polkgigr  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(594)

我有要切换到stackexchange.redis的现有servicestack服务,一次切换一个。这涉及到交换发送方和最终接收方。这个问题是关于从stackexchange.redis发布到servicestack.redis的。
这是一个简单的发布程序,我把它放在一个控制台应用程序中测试这个概念。

namespace SEMQSender
{
    public class MessagePublisher
    {
        IConnectionMultiplexer _connectionMultiplexer;
        public MessagePublisher()
        {
            _connectionMultiplexer = ConnectionMultiplexer.Connect(new ConfigurationOptions()
            {
                EndPoints = {
                        {
                        "MyRedisServer"
                        }
                },
                DefaultDatabase = 0,
                AllowAdmin = true,
                SyncTimeout = 100000
            });
        }

        public void Run()
        {
            var request = new MyRequest()
            {
                Id = 27
            };
            PushServiceStackRequest(request);
        }

        public void PushServiceStackRequest<T>(T request)
        {
            var messageText = SerializeRequestAsServiceStackMessage(request);
            Push($"mq:{request.GetType().Name}.inq", messageText);
        }

        public string SerializeRequestAsServiceStackMessage<T>(T request)
        {
            var requestJson = JsonSerializer.Serialize(request);
            requestJson.Remove(0, 1);
            var serviceStackMessage = new ServiceStackMessage()
            {
                Id = Guid.NewGuid(),
                CreatedDate = DateTimeOffset.Now,
                Options = 1,
                Priority = 0,
                RetryAttempts = 0
            };
            var messageJson = JsonSerializer.Serialize(serviceStackMessage);
            var requestType = request.GetType();
            var sBuilder = new StringBuilder();
            sBuilder.AppendJoin('.', requestType.Namespace.Split('.').Take(2));
            var ns = sBuilder.ToString();
            var result = $"{messageJson.Remove(messageJson.Length - 1, 1)}, \"Body\":{{\"__type\":\"{requestType.FullName}, {ns}\",{requestJson.Remove(0, 1)}}}";
            return result;
        }

        public void Push(RedisKey queueName, RedisValue value)
        {
            _connectionMultiplexer.GetDatabase().ListRightPush(queueName, value);
        }
    }

    public class ServiceStackRedisMessage
    {
        public Guid Id { get; set; }
        public DateTimeOffset CreatedDate { get; set; }
        public int Priority { get; set; }
        public int RetryAttempts { get; set; }
        public int Options { get; set; }
    }
}

namespace MyServiceStackService.ServiceModel.MyService
{
    public class MyRequest
    {
        public int Id { get; set; }
    }
}

这是我们的servicestack服务如何订阅redis消息的一个例子

container.Register<IRedisClientsManager>(c => new RedisManagerPool(ConfigurationManager.AppSettings["Redis"]));
    container.Register<ICacheClient>(c => container.Resolve<IRedisClientsManager>().GetCacheClient());
    var mqHost = new RedisMqServer(container.Resolve<IRedisClientsManager>(), retryCount: 2);
    container.Register<IMessageService>(c => mqHost);

    mqHost.RegisterHandler<MyRequest>(this.ServiceController.ExecuteMessage);

    mqHost.Start();

据我所知,redis键和值与使用servicestack发布消息时生成的相同,但在订户端发生了一些奇怪的事情。只有在服务首次启动时,消息才会从队列中提取。在此之后放置在队列上的所有消息都保留在原来的位置,直到服务重新启动。拾取的消息在反序列化对象上具有所有预期数据。
希望对stackexchange.redis或servicestack.redis有更多了解的人能帮上忙。以防有人好奇:我们正在切换到stackexchange.redis,以便可以对redis进行异步调用,而servicestack.redis不支持这种调用。

yfjy0ee7

yfjy0ee71#

如果您想知道客户端正在发送什么命令,可以从redis cli使用redis的monitor debugging命令,该命令可以让您实时查看发送到redis服务器的所有命令。
要模拟redismq客户机,还需要将队列的名称发布到redispub/sub主题 QueueNames.TopicIn ( mq:topic:in )它通知redis mq服务器消息已发布到该mq。

相关问题