2011-11-09 5 views
1

私は永続的な接続のプールを持っています(Memcachedクライアント)。データはmemcachedサーバーにキャッシュされています。私は私がしようと、再起動後に初めてこの例外を取得memcachedサーバーの再起動後に予期しない動作が発生しました。どのように構成/整流するのですか?

java.util.concurrent.ExecutionException: java.lang.RuntimeException: Cancelled 
    at net.spy.memcached.MemcachedClient$OperationFuture.get(MemcachedClient.java:1662) 
    at net.spy.memcached.MemcachedClient$GetFuture.get(MemcachedClient.java:1708) 
    at com.eos.gds.cache.CacheClient.get(CacheClient.java:49) 

:memcachedサーバを再起動した後、私はプールからクライアントを使用して、キャッシュされたデータを取得しようとすると、私は以下の例外を取得mはキャッシュされたデータを取得します。私は多くの検索をしました。しかし、これの正確な理由を見つけることができません。

答えて

1

Spymemcachedには、実際にmemcachedに送信される前に操作が配置される一連の内部キューがあります。ここで何が起こっているのかは、操作をしてから、その操作が電線経由で送信される前、またはmemcachedから応答が受信される前に、Spymemcachedは接続が失われたことを認識します。その結果、Spymemcachedはすべての操作をキャンセルして接続を再確立します。

将来的にget()を呼び出すと、Spymemcachedによって操作がキャンセルされたため、例外がスローされます。私がここでやってお勧めするのは、Spymemcachedで行う個々の操作ごとにすべての例外をキャッチし、エラーに応じて、それを忘れるという操作を再試行することです。例えば、getの場合、memcachedサーバーのクラスターがダウンすると、キャッシュが空になる可能性があるので、おそらくそれを忘れるかもしれませんが、おそらくセットを再試行したいでしょう。

+0

私はSpymemcachedがキューを維持する部分を理解しました。したがって、すべての操作はSpymemcachedによってキャンセルされます。私はまた、例外をキャッチし、将来の 'future.cancel(false)'をキャンセルするので、memcachedサーバーが起動しているときには何もキューにはありません。しかし、サーバが立ち上がった直後の操作はどうですか?永続的なクライアントが接続を失い、再度接続する必要があるため、例外が発生していますか? –

+0

こんにちはMikewied、私はsypmemecachedが飛行中のすべての操作をキャンセルする理由を知ることができますか?接続を確立してリクエストを再試行する必要がありますか? – Xilang

+0

操作を再度送信する場合は、接続ファクトリビルダーでOperationState.RETRYを設定できると思います。操作が失敗した場合、操作をやり直すには時間がかかりすぎるため、ユーザーは実際には気にしないかもしれないので、操作はデフォルトでキャンセルされる可能性があります。 – mikewied

0

私はまったく同じ問題に遭遇したと実行MemcachedClient.getStats(成功

while(true){ 
try{ 
    memcacheclient.get(key); 
    break; 
} 
catch(java.util.concurrent.CancellationException e){ 
    log.info("cache cancelled"); 
} 
} 
0

まで、例外を処理することによって、それを修正)それぞれの新しいクライアントのために一度、それが打ち消されの問題を修正します。