1

我们使用 IMessageQueueClient 将消息推送到 Redis 队列并通过 registerhandler 方法获取它们。https://docs.servicestack.net/redis-mq#redis

这很好用,没有抱怨。

但是, IMessageQueueClient.Publish() 具有设置队列名称的重载。通过实验,这会将 redis 列表键从 mq:objectname.inq 更改为您作为客户端名称传入的任何字符串。

我们希望能够使用 registerhandler 方法使用不同/前缀/后缀的通道来处理相同的对象类型。我们正在尝试实现这一点,因为我们有多个服务器触发引发这些消息的方法,并希望这些服务器处理自己的消息。

这是可能的还是我们需要使用单独的redis服务器/单独的redis数据库?

4

1 回答 1

1

我已经找到了实现这一目标的方法。如果有更优雅的方式来实现这一点,请告诉我。在此处添加以供希望实现相同目标的任何人参考

var redisConnection = "localhost:6379";
        var a = new Test() {
            Id = Guid.NewGuid()
        };

        var b = new Test() {
            Id = Guid.NewGuid()
        };
        var redisFactory = new PooledRedisClientManager(redisConnection);
        var mqHost = new RedisMqServer(redisFactory, retryCount: 5);
        mqHost.RegisterHandler<TestA>(model =>
        {
            Test d = model.Body as Test;
            Debug.Assert(a.Id == d.Id);
            return "A";
        });
        mqHost.RegisterHandler<TestB>(model =>
        {
            Test d = model.Body as Test;
            Debug.Assert(b.Id == d.Id);
            return "B";
        });
        mqHost.Start();
        var client = mqHost.CreateMessageQueueClient();
        var data = MessageFactory.Create(a);
        client.Publish($"mq:{typeof(Test).Name}A.inq", data ); 
        var dataB = MessageFactory.Create(a);
        client.Publish($"mq:{typeof(Test).Name}B.inq", data);
        
       while (true) { }
...
       public class TestA : Test { }
       public class TestB : Test { }
       public class  Test {
           public Guid Id { get; set; }
       }
于 2021-11-19T17:39:27.077 回答