2016-06-30 1 views
0

der Code in meinem Server:Wie verhindert man eine Dead-Sperre der Transaktion, wenn der Client abstürzt?

  TransactionContext txCxt = hz.newTransactionContext(txop); 
      txCxt.beginTransaction(); 
      TransactionalMap<Object, Object> map = txCxt.getMap(NearCacheTest.MAP); 

      try { 
       String tmp = String.valueOf(System.currentTimeMillis()); 
       map.put("1", tmp); // reader1 is blocked 
       tmp = String.valueOf(System.currentTimeMillis()); 
       map.put("2", tmp); // reader2 is blocked 

       // evict all client map cache 
       IList<Object> evictList = hz.getList(NearCacheTest.SEMAPHORE_EVICT); 
       evictList.add("1"); 
       evictList.add("2"); 

       int size = hz.getClientService().getConnectedClients().size(); 
       hz.getSemaphore(NearCacheTest.SEMAPHORE_EVICT).release(size); 
       hz.getAtomicLong(NearCacheTest.SEMAPHORE_EVICT).set(size); 
       logger.info("client count:{}", size); 

       // wait to response from clients 
       logger.info("waiting for event:{}", NearCacheTest.SEMAPHORE_ACK); 
       hz.getSemaphore(NearCacheTest.SEMAPHORE_ACK).acquire(); 

Meine Frage ist:; wenn einer der Clients abstürzen, semaphore_ack kann nie freigegeben werden

Was kann ich tun, um das Dead Lock zu verhindern?

Antwort

0
    // evict all client map cache 
       IList<Object> evictList = hz.getList(NearCacheTest.SEMAPHORE_EVICT); 
       evictList.add("1"); 
       evictList.add("2"); 

       int size = hz.getClientService().getConnectedClients().size(); 
       ISemaphore semaphore = hz.getSemaphore(NearCacheTest.SEMAPHORE_EVICT); 
       semaphore.release(size); 
       logger.info("client count:{}", size); 

       // wait to response from clients 
       while (semaphore.tryAcquire()) { 
       } 
Verwandte Themen