2013-08-06 8 views
0

애플리케이션 범위 Bean의 데이터 변경에 대해 EJB/Seam 세션 빈에 알리는 가장 좋은 방법은 무엇일까?Seam 세션 빈에 변경된 데이터를 알려주는 방법

제 경우에는 응용 프로그램 데이터를 최신 상태로 유지하기 위해 다양한 서비스와 통신하는 중앙 (응용 프로그램 범위) seam2 bean이 있습니다. 변경 사항이 생기면 변경된 데이터에 대해 모든 현재 사용자 세션에 통보해야하며 가능한 한 빨리 데이터를 가져올 수 있습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?

Seam의 @RaiseEvent, @Observer 접근 방식을 시도했지만 ApplicationScope에서 SessionScope의 Bean에 통지 할 수없는 것으로 보입니다. 내가 JEE5, Seam2을 사용하고

, EJB3.0

감사

일할 수있는 약간의 트릭을 필요로하는 솔루션을 발견하는 경우
+0

당신은 JEE 6? 그건 CDI 콩 매우 쉬운 것입니다 전환 할 수 (당신은 CDI의 찬성되지 고려되는 심 포기 수) –

+0

는 불행히도이 순간에 옵션이 아닙니다합니다. – Richard

답변

0

.

내 프로젝트에 두 개의 새로운 인터페이스를 생성 한 모든

첫째 :

public interface IDataProvider { 

    public void register(IDataObserver observer); 

    public void unregister(IDataObserver observer); 
} 

public interface IDataObserver { 
    public void update(); 
} 

내 콩에 두 개의 인터페이스를 구현 번째 단계로. 당신이 Component.getInstance()를 통해하지 @In을 통해 심 구성 요소를 삽입 할 경우

@Name(ApplicationBean.BEAN_NAME) 
@Scope(ScopeType.APPLICATION) 
public class ApplicationBean implements IDataProvider { 
    private Set<IDataObserver> observerList = new HashSet<IDataObserver>(); 

    @Override 
    public void register(IDataObserver observer) { 
     this.observerList.add(observer); 

    } 

    @Override 
    public void unregister(IDataObserver observer) { 
     this.observerList.remove(observer); 
    } 

    public void notifyAllObserver() { 
     for(IDataObserver observer : observerList) { 
      observer.update(); 
     } 
    } 
} 

@Name(SessionBean.BEAN_NAME) 
@Scope(ScopeType.SESSION) 
public class SessionBean implements IDataObserver { 

    @Create 
    public void init() { 
     // inject dependencies 
     injectBeans(); 

     // register at the dataserviceprovider to be notified about data changes 
     dataProviderService.register(this); 
    } 

    private void injectBeans() { 
     dataProviderService = (DataProviderService) Component.getInstance(
       DataProviderService.BEAN_NAME, ScopeType.APPLICATION); 
    } 

    @Destroy 
    public void shutDown() { 
     dataProviderService.unregister(this); 
    } 

    @Override 
    public void update() { 
     // grab data from 
    } 
} 

이 방법에만 작동 양해하여 주시기 바랍니다. 이후의 경우에는 update()가 호출 되 자마자 항상 null이 반환됩니다.

+0

Seam-Components를 다루는 동안 "클래식"옵저버 패턴을 사용하는 것은 좋은 생각이 아닙니다. Seam 구성 요소에 대한 참조는 권장하지 않습니다. 예를 들어 http://seamframework.org/Documentation/CanIHoldAReferenceToASeamComponentSuchAsInalist와 같은 모든 Seam 메커니즘이 작동하지 않습니다. 어쨌든 - 업데이트 방법에서 Seam 컨텍스트에서 해당 구성 요소의 인스턴스를 얻을 수 있습니다. 그냥'Component.getInstance (BEAN_NAME)'을 사용하고이 "새로운"객체에 대해 모든 작업을 수행하면됩니다. – MrD

+0

추가 정보 하나 : Seam 컨텍스트에서 컴포넌트에서 호출하는 메소드는 비공개가 아니어야합니다. Seam-proxy는 private 메소드를 래핑하지 않는다. – MrD

+0

귀하의 조언에 고마워, 내 오류를보고 내 주사 코드를 적절하게 변경했습니다. 내 관찰자 패턴을 구현하기 위해 표준 솔기 이벤트 메커니즘을 고수하고 싶지만 불행히도 응용 범위와 세션 범위 콩 사이에서 실행하지 못했습니다. 응용 범위가 지정된 bean 사이에서는 매우 잘 작동합니다. – Richard