2011-11-14 3 views
1

내가, 내가 프로덕션 환경에서 이상한 문제에 직면JBoss 캐시. 동시성 문제

JBossCache '말라 게타'3.2.0.GA를 사용하고 가끔 제대로 작동하지 않습니다 제이 보스 캐시에 기록합니다. 나는 수시로 간단한 자바 응용 프로그램

public static void testCache() { 
    Cache cache = new DefaultCacheFactory().createCache(false); 
    cache.create(); 
    cache.start(); 
    final Node node = cache.getRoot().addChild(Fqn.fromString("/child1")); 
    int threadsCount = 20; 
    final CyclicBarrier b = new CyclicBarrier(threadsCount); 
    for (int i = 0; i < threadsCount; i++) { 
     final long j = i; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        b.await(); 
        String name = RandomGenerator.getRandomName(4); 
        node.put(j, name); 
        String nameFromCache = (String) node.get(j); 
        if (!name.equals(nameFromCache)) { 
         System.out.println("error"); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 

으로이 상황을 재현하려고, 난 static void main에서 실행이 테스트 출력 "오류", 실패합니다. 1의 3은 오류 메시지를 반환합니다. 단순히 null을 반환합니다. 나는 모든 기계에 그것을 재현 할 수 없다.

단서가 있습니까?

+0

액세스하기 전에 노드를 잠글 필요가 있습니까? – Fakrudeen

답변

2

Jboss 캐시가 비동기 적이므로 코드가 정상적으로 처리됩니다. Javadocs에서는 캐시가 업데이트 될 때를 보장하지 않습니다.

많은 분산 캐시 구현에서, put 작업이 유선에 기록되며 캐시의 로컬 인스턴스도 로컬 호출을 통하지 않고 인바운드 메시지에서 업데이트됩니다. 이를 통해 캐시는 네트워크의 모든 노드에서 여러 시스템의 업데이트가 올바른 순서로 처리되도록 업데이트를 적절하게 직렬화 할 수 있습니다.

캐시를 LOCAL로 설정하는 것이 좋습니다. 다음과 같은 것 :

그렇다면 내가 틀렸다고 생각합니다. 여전히 실패하더라도, LOCAL 모드는 여전히 루프백 네트워크 스택을 가지고있을 수 있습니다.

희망이 도움이됩니다.

+0

기본적으로 캐시는 로컬 모드에서 실행되며 jboss 캐시 버그 인 것 같습니다. – user12384512

+0

시도해 볼 또 다른 것은 스핀 루프를 각 스레드에 넣고 null 응답이 사라지는 데 걸리는 시간을 확인하는 것입니다. – Gray