2013-03-28 84 views
1

我在VS2010中使用我打算使用它的方式處理1.1.0.5版本的Booksleeve時遇到了困難。發生什麼事是在執行並等待操作之後,Booksleeve有時會使連接處於關閉狀態,因此下游操作會引發異常。書套過早關閉連接?

我遇到的最簡單的問題是:

static void Main(string[] args) 
{ 
    Func<RedisConnection> getNewRedisConnection =() => 
     { 
      RedisConnection conn = new RedisConnection("Belasco"); 
      conn.Error += (obj, eArgs) => { throw eArgs.Exception; }; 
      return conn; 
     }; 

    RedisConnection redisConn = null; 
    TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException); 

    redisConn = getNewRedisConnection(); 
    redisConn.Open(); 

    var test1 = redisConn.Sets.GetAllString(0, "test1"); 
    var testValues1 = test1.Result; 
    //var testValues1 = redisConn.Wait(test1); 

    var test2 = redisConn.Sets.GetAllString(0, "test2"); 
    var testValues2 = test2.Result; 
    //var testValues2 = redisConn.Wait(test2); 

    redisConn.Close(false); 

    Console.WriteLine("Done"); 
    Console.ReadKey(); 
} 

static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 

var test2 = redisConn.Sets.GetAllString(0, "test2");行拋出「隊列關閉」異常。

現在,如果我關閉並重新打開中間連接的請求,事情似乎工作。

var test1 = redisConn.Sets.GetAllString(0, "test1"); 
    var testValues1 = test1.Result; 
    //var testValues1 = redisConn.Wait(test1); 

    redisConn.Close(false); 
    redisConn = getNewRedisConnection(); 
    redisConn.Open(); 

    var test2 = redisConn.Sets.GetAllString(0, "test2"); 
    var testValues2 = test2.Result; 
    //var testValues2 = redisConn.Wait(test2); 

但是,如果我執行「設置」操作,所有似乎都回到破碎。

redisConn = getNewRedisConnection(); 
    redisConn.Open(); 

    var test0 = redisConn.Sets.Add(0, "test1", new string[] { "11", "22", "33", "44", "55" }); 
    redisConn.Wait(test0); 

    redisConn.Close(false); 
    redisConn = getNewRedisConnection(); 
    redisConn.Open(); 

    var test1 = redisConn.Sets.GetAllString(0, "test1"); 
    var testValues1 = test1.Result; 
    //var testValues1 = redisConn.Wait(test1); 

    redisConn.Close(false); 
    redisConn = getNewRedisConnection(); 
    redisConn.Open(); 

    var test2 = redisConn.Sets.GetAllString(0, "test2"); 
    var testValues2 = test2.Result; 
    //var testValues2 = redisConn.Wait(test2); 

我也有交易相同的問題,但我覺得它源於同樣的問題。之所以我需要檢索值,然後排隊其他命令是因爲我後來的Redis操作是根據我返回的值確定的!

回答

0

首先,請不要在這裏熱切關閉連接。 BookSleeve被設計爲用作線程安全的多路複用器,同時承載來自任何隨機數量的呼叫者的負載。打開連接時會有開銷。現在,有幾種方法紅色是連接可以成爲封閉:

  • 你擇關閉它
  • 服務器關閉它(連接超時,客戶端無法處理積壓)
  • 客戶端檢測的東西在入站流它不指望

我的這裏猜測是服務器有連接超時配置。我不知道大約1.1。*,但是自動超時配置檢測和保持活動的「ping」消息在某些時候添加了,這有所幫助。你可以通過redis-cli中的「config get timeout」來檢查超時時間。如果這是問題,您可能會發現升級客戶端版本有幫助。在某些版本中,您還可以手動指定超時配置(如果您希望否決服務器)。

對於意外的數據 - 這不太可能,但有幾個事件可以檢測,記錄並對此做出反應。

+0

軟件包的更新似乎確定了這個問題。我原先使用https://code.google.com/p/booksleeve/downloads/list頁面下載。我在NuGet(1.3。*)中發現了當前的版本,並且工作很好。 – AniAko

+0

@AniAko我不記得那裏有下載 - 我會刪除那個,ta –