2013-11-26 26 views
1

我正在使用servicestack.redis客户端进行连接。 Redis基本上被用作SignalR背板(使用bookleeve客户端)。我还使用ServiceStack.Redis客户端保持连接列表ServiceStack.Redis客户端 - 交易已在进行中

我有这样的代码在RedisConnectionManager.cs(与AddConnectionGetConnections类似的方法沿着该AddConnectionRemoveConnection通过在SignalR枢纽方法调用。

现在,让我们来看看这个问题......在一段时间后,我得到了InvalidOperationException与在CreateTransaction呼叫消息A transaction is already in progress,这通常是一个例外,通过Redis的if语句if (connections == null || connections.Count == 0)

后抛出一个不管怎么样,在那之后,在我重新开始这个过程之前,事情不再起作用 - 因为每次我得到一个InvalidOperationException。我插入ServiceStack.Redis客户端代码,根据文档,它应该提交或放弃交易。似乎没有发生这种情况,然后客户端处于一种缓冲状态,因为RedisClient.Transaction对象从来不是null ed。

我找不到ServiceStack.Redis的bug跟踪器,所以希望SO的朋友能更好地了解。

public void RemoveConnection(string clientId, string connectionId) 
    { 

     try 
     { 
      var key = "CONNECTION_" + clientId; 
      redis.Watch(key); 

      var connections = redisTypedClient.Lists[key]; 


      if (connections == null || connections.Count == 0) 
      { 
       return; 
      } 


      using (var t = redisTypedClient.CreateTransaction()) 
      { 
       t.QueueCommand(c => c.RemoveItemFromList(connections, connectionId)); 
       t.Commit(); 
      } 

     } 
     finally 
     { 
      redis.UnWatch(); 
     } 
    } 

回答

1

所以在这种情况下,问题是我重新使用redis连接,这不是一个好主意。每当我开始创建和使用新的Redis连接时,此问题就消失了。