我正在使用服务堆栈连接到Redis并使用SubPub功能。
我应该保持IRedisSubscription和IRedisClient实例化还活着吗?例如,我应该将它分配给类级变量吗?
或者我可以简单地将其范围放在using语句中,服务栈将处理持久性吗?
即,以下哪个例子是正确的:
公共类RedisPubSub1:IDisposable {
private static PooledRedisClientManager ClientPool = new PooledRedisClientManager("connectionString"); private IRedisSubscription _subscription; private IRedisClient _client; private Action<string, string> _publish; public event Action<string, string> Publish { add { _publish += value; } remove { _publish -= value; } } public RedisPubSub1() { Task.Factory.StartNew(() => { _client = ClientPool.GetClient(); _subscription = _client.CreateSubscription(); { _subscription.OnMessage = EnqueEvent; _subscription.SubscribeToChannels(new string[] { Channel }); } }); } private void EnqueEvent(string channel, string message) { if (_publish!= null) _publish(channel, message); } public void Dispose() { _subscription.Dispose(); _client.Dispose(); } } }
或
公共类RedisPubSub2 {
private static PooledRedisClientManager ClientPool = new PooledRedisClientManager("connectionString"); private Action<string, string> _publish; public event Action<string, string> Publish { add { _publish += value; } remove { _publish -= value; } } public RedisPubSub2() { Task.Factory.StartNew(() => { using(var _client = ClientPool.GetClient()) { using(_subscription = _client.CreateSubscription() { _subscription.OnMessage = EnqueEvent; _subscription.SubscribeToChannels(new string[] { Channel }); } } }); } private void EnqueEvent(string channel, string message) { if (_publish!= null) _publish(channel, message); } }
答案 0 :(得分:2)
SubscribeToChannels是阻塞的,所以如果你保留对连接的引用并不重要,因为它不会处理,除非你结束订阅(即取消订阅)。
建议您在需要时以某种方式取消订阅订阅,您可以使用RedisMqServer example中所示的持有活动订阅的主题进行操作,例如:
using (var subscription = redisClient.CreateSubscription())
{
subscription.OnUnSubscribe = channel =>
Log.Debug("OnUnSubscribe: " + channel);
subscription.OnMessage = (channel, msg) =>
{
if (msg == "STOP")
{
Log.Debug("UnSubscribe From All Channels...");
subscription.UnSubscribeFromAllChannels(); //Un block thread.
return;
}
handleMessage(msg);
}
...
//Unsubscribing will unblock this subscription:
subscription.SubscribeToChannels(QueueNames.TopicIn); //blocks thread
}