2017-09-14 9 views
0

구매 주문을 처리하는 응용 프로그램을 작성 중입니다.
이 응용 프로그램은 EJB1을 기반으로하며 IBM Websphere에서 실행됩니다.
해결해야 할 시나리오가 있습니다.EJB 2 세션 빈에서 Ashton 싱글 톤 기능

주문 묶음을 처리하는 Stateless Session Bean이 있습니다 (일반적으로 주문 수량은 약 5K입니다). 이 기능을 동기화하려고합니다.
즉, 사용자 중 하나가 주문 처리를 활성화하면 첫 번째 처리가 완료 될 때까지 다른 사용자가 프로세스를 시작할 수 없어야합니다.

일부 제약으로 인해이를 EJB3으로 업그레이드 할 수 없습니다.
이 문제를 효과적으로 해결할 수있는 방법이 있습니까?
제공된 솔루션이 코드 변경을 덜 필요로하기를 기대합니다.

답변

1

답변은 실제로 주문의 존재/저장 방법 및 동시에 실행되는 서버 인스턴스가 주문을 시작할 수있는 수에 따라 달라집니다. 처리.

주문이 메모리에만있는 경우 (거의 없을 것 같음) 또는이 기능을 수행하기 위해 하나의 응용 프로그램 서버 프로세스 만 실행중인 경우 무 상태 세션빈 클래스에 정적 필드를 추가하고 동기화 할 수 있습니다. 이것은 EJB 3.x 싱글 톤 빈과 비슷한 기능을 제공합니다.

그러나 동일한 응용 프로그램이 여러 응용 프로그램 서버 인스턴스에서 동시에 실행되는 경우 서버 당 인스턴스가 여전히 존재하므로 프로세스간에 동기화가 없으므로 싱글 톤 bean도 작동하지 않습니다. 이 경우, 상태 비 저장 Bean에 명령이 저장된 위치의 잠금을 확보해야합니다. 예를 들어, 주문이 DB2 데이터베이스의 행에 저장되어있는 경우, 동일한 행에 하나의 행이있는 동일한 데이터베이스에 다른 테이블을 추가 할 수 있으며, 상태 비 저장 Bean은 주문을 처리하기 전에 행의 행 잠금을 가져와야합니다 . 이렇게하면 모든 응용 프로그램 서버 인스턴스가 동일한 공유 데이터베이스에 액세스한다고 가정 할 때 프로세스간에 동기화가 제공됩니다.

+0

아니요 다중 서버 인스턴스가 없습니다. 오직 하나. 또한 주문과 관련하여 처리되지 않은 주문으로 DB에 저장됩니다. 관리자는 하루에 한 번 또는 며칠에 대량으로 처리합니다. 처리는 실제로 한 테이블에서 다른 테이블로 레코드를 이동시킵니다. 하지만 EJB 메소드를 호출하는 버튼을 클릭하면됩니다. 그것의 조금 시간이 걸리는 과정은 3-4 분이 걸릴 수 있습니다. 내가 피하기를 원하는 것은 관리자가 시작한 프로세스가 진행될 때까지 프로세스를 시작하는 다른 관리자 사용자입니다. –

+0

그래서 무 상태 빈에 정적 필드를 추가 한 다음 메서드에서 동기화하는 것만으로도 트릭을 수행해야합니다. 'private static final Object syncObj = 새로운 객체();' – Tracy