2011-03-28 5 views
4

JBoss AS 6을 사용하여 Java EE 애플리케이션을 작성 중이며 특정 매개 변수에 대한 메소드에 독점적 액세스 (타사 비트의 소프트웨어에 대한 일부 인터페이스)가 필요한 리소스가 있습니다. 현재 저는 장난 꾸러기 (specification prohibits it부터)이고 잠금을 처리하기 위해 java.util.concurrent.ReentrantLock을 사용하고 있습니다.Distributed Locking and Java EE

이제 여러 JBoss 응용 프로그램 서버를 함께 클러스터링하므로 클러스터의 다른 노드에서 작동하는 솔루션이 필요합니다. 적어도 다음과 같은 옵션이 있다고 생각합니다.

  1. 공유 캐시는 (Infinispan)
  2. JGroups
  3. 파일 시스템 (아마 나쁜, 그러나 우리는 어쨌든 공유 파일 시스템에 의존) 잠금을 기반
  4. 데이터베이스
  5. Singleton EJB 년대를?

적으로는, 내가 그래서 난 내가 어떤 옵션을 놓친 적이이

public class MyEJBBean { 

    private SharedLock lock; 

    public void doSomethingWithSharedResource(String s) { 
     lock.lock(); // blocks until shared resource is not used by anyone else 
     try { 
      // Use shared resource 
     } 
     finally { 
      lock.unlock(); 
     } 
    } 

같은 EJB 방법을 쓸 수있는 높은 수준의 API를 찾고 있어요? 누구나 공유 할 수있는 이런 종류의 잠금 메커니즘을 가진 경험이 있습니까?

답변

2

이상적으로는 타사 소프트웨어를 단 하나의 인스턴스에서 실행되는 별도의 응용 프로그램에 배치하는 것이 좋습니다. 이 방법을 사용하면 EJB 싱글 톤을 사용하여 잠금을 처리 할 수 ​​있습니다 (나는 @Singleton이 시나리오에서 도움이되지 않을 것이라고 생각합니다). 원격 EJB/WS를 사용하여 노출합니다. 이 소프트웨어 조각이 좀 더 고약한 것처럼 보입니다 (단일 스레드?). 그래서보다 사용자 친화적 인 EJB 인터페이스를 갖는 것이 추가적인 이점이 될 것입니다.

생각해보십시오. 전체 시스템에 대해 한 번에 라이브러리에만 액세스 할 수 있다면 왜 배포해야합니까? 항상 하나의 인스턴스 만 사용할 수 있습니다.

균질 분산 시스템 (일반적으로 나쁜 생각은 아닙니다)을 사용하려면 SELECT FOR UPDATE을 사용하여 데이터베이스 잠금을 제안하십시오. 나는 그것을 시도한 적이 없지만 라이브러리를 사용하기 전에 (잠금을 얻음) SQL을 발행하고 나중에 EJB 컨테이너가 트랜잭션을 커밋 (잠금을 효과적으로 해제)하면 트릭이 수행된다고 생각합니다.

+3

이전에 데이터베이스 잠금 기법을 사용해 보았습니다. 클러스터를 지원하는 단일 DB 인스턴스가있는 경우 잠금을 수행하는 데는 매우 효과적이고 저렴한 방법입니다. 다른 생각은 타사 서비스 루틴을 JMS 대기열의 다른 끝에 배치하는 것입니다. 요청은 대기열에 게시되고 서비스는 이에 대한 작업을 수행 한 다음 메시지에 첨부 된 임시 대기열을 통해 결과를 다시 게시합니다. 분명히 여전히 잠금이 있지만 JMS 서버 내에 있으며 더 이상 애플리케이션의 첫 번째 클래스 개념이 아닙니다. –

+0

+1, 단일 소비자가있는 JMS가 가장 JEE-ish 방법 인 것처럼 보입니다. –

+0

그것은 약간 더 복잡합니다. API에는 foo (String s) 메소드가 있습니다.이 메소드는 같은 시간에 두 번 호출 될 수 없습니다. 좋은 제안처럼 들리므로 내일 일하게 될 때 그걸 가지고 놀 것입니다. –