Servicestack.Redis Pub / Sub限制与其他嵌套的Redis命令

时间:2014-05-18 00:35:54

标签: redis servicestack threadpool publish-subscribe

我在ServiceStack& amp; Redis,但是我在线程中被ThreadPool和Pub / Sub搞糊涂了,而且在消息回调中访问Redis的明显限制。我得到的实际错误表明我只能打电话给#34;订阅"或者"发布"在"当前背景下#34;当我尝试从消息回调中执行另一个Redis操作时会发生这种情况。

我有一个必须持续运行的流程。在我的情况下,我不能只为一次请求服务,但必须始终保持线程处于活动状态(并且从REST API路由控制这些线程是理想的)。数据必须定期进入流程,并且必须发布数据。该过程还必须存储和检索Redis中的数据。我正在使用路由和服务来获取数据并将其存储在Redis中,因此必须从"计算"中进行异步。处理。我认为pub / sub将是将各个部分粘合在一起的答案,但到目前为止似乎并不可能。

以下是我的代码当前的结构(具有上述错误的代码)。这是开始长期"计算"的路线的回调。螺纹:

    public object Get(SystemCmd request)
    {
        object ctx = new object();
        TradingSystemCmd SystemCmd = new TradingSystemCmd(request, ctx);

        ThreadPool.QueueUserWorkItem(x =>
        {
            SystemCmd.signalEngine();
        });
        return (retVal);  // retVal defined elsewhere
    }

这是SystemCmd.signalEngine():

       public void signalEngine(){

        using (var subscription = Redis.CreateSubscription())
        {            
            subscription.OnSubscribe = channel =>
            {
            };

            subscription.OnUnSubscribe = channel =>
            {
            };

            subscription.OnMessage = (channel, msg) =>
            {

                    TC_CalcBar(channel, redisTrade);

            };


            subscription.SubscribeToChannels(dmx_key); //blocking
        }
    }

" TC_CalcBar" call会在数据可用时对数据进行处理。在此调用中,调用Redis进行常规数据库访问(以及错误)。我可以做的是删除订阅并使用另一种方法来阻止Redis中可用的数据。但目前的做法似乎很不错,直到它失败了。 : - )

我也不知道ThreadPool是否与错误有关。

1 个答案:

答案 0 :(得分:2)

根据Redis文档:

  

一旦客户端进入订阅状态,就不应该这样做   发出任何其他命令,除了额外的SUBSCRIBE,PSUBSCRIBE,   UNSUBSCRIBE和PUNSUBSCRIBE命令。

来源:http://redis.io/commands/subscribe