【发布时间】:2014-07-06 05:12:51
【问题描述】:
我在使用 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是否与错误有关。
【问题讨论】:
-
我已经通过测试确认 Sub 回调仅限于 Pub / Sub 操作,至少在同一个 Redis 连接上。我有点惊讶这不是一个更大的话题,因为我从未见过任何关于它的帖子。很高兴知道您是否可以建立不同的 Redis 连接并以这种方式访问数据库?
-
我知道这是一个旧线程,但是是的,您在评论中描述的是正确的方法;留下一个
RedisClient专用于订阅,并在收到您的信号后使用另一个从 Redis 读取/写入。
标签: redis servicestack threadpool publish-subscribe