我对 ServiceStack 和 Redis 有很好的体验,但我对线程内的 ThreadPool 和 Pub/Sub 以及在消息回调中访问 Redis 的明显限制感到困惑。我得到的实际错误表明我只能在“当前上下文”中调用“订阅”或“发布”。当我尝试从消息回调执行另一个 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”调用会在数据可用时对其进行处理。在这个调用中是对 Redis 的调用以进行常规数据库访问(和错误)。我能做的是删除订阅并使用另一种方法来阻止 Redis 中可用的数据。但是当前的方法在失败之前看起来非常好。 :-)
我也不知道 ThreadPool 是否与错误有关。
最佳答案
根据 Redis 文档:
Once the client enters the subscribed state it is not supposed to issue any other commands, except for additional SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE and PUNSUBSCRIBE commands.
关于redis - Servicestack.Redis Pub/Sub 与其他嵌套 Redis 命令的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23717483/