2013-08-06 42 views
0

我想知道什麼是通知EJB/Seam會話bean有關應用程序作用域bean中的數據更改的最佳方法。如何通知Seam會話bean有關更改的數據

在我的使用案例中,我有一箇中央(應用程序作用域)seam2 bean,它與不同的服務進行通信以保持應用程序數據是最新的。 只要有任何變化,我需要通知我所有當前的用戶會話有關更改的數據,他們可以儘快拿起它。達到此目的的最佳方法是什麼?

我試過@RaiseEvent,Seam的@Observer方法,但似乎無法通過ApplicationScope在SessionScope中通知bean。

我使用JEE5,Seam2,EJB3.0

感謝

+0

你可以切換到JEE 6嗎?對於CDI bean來說這很容易(你可以放棄Seam,這被認爲是棄用CDI) –

+0

不幸的是,這不是一個選項。 – Richard

回答

0

如果找到了解決辦法,這需要一個小動作工作。

首先我已經在我的項目創造了兩個新的接口:

public interface IDataProvider { 

    public void register(IDataObserver observer); 

    public void unregister(IDataObserver observer); 
} 

public interface IDataObserver { 
    public void update(); 
} 

正如我實現我的豆子在兩個接口的第二步驟。

@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 
    } 
} 

如果通過Component.getInstance()而不是通過@In注入Seam組件一起請注意,這種方法只適用。在後面的例子中,只要update()被調用,你將總是得到null!

+0

在處理Seam-Components時,使用「古典」觀察者模式並不是一個好主意。不建議保持對Seam-Components的引用 - 所有的Seam機制都不起作用(例如http://seamframework.org/Documentation/CanIHoldAReferenceToASeamComponentSuchAsInAList)。 無論如何 - 在你的更新方法中,你可以在Seam上下文中獲得該組件的一個實例。只需使用'Component.getInstance(BEAN_NAME)'並在這個「新」對象上做所有事情。 – MrD

+0

另外需要注意的一點是:Seam上下文中調用組件的方法不能是私有的。看來Seam代理不會包裝私有方法。 – MrD

+0

感謝您的建議,我看到了我的錯誤,並相應地更改了我的注射代碼。我也很想堅持使用標準接縫事件機制來實現我的觀察者模式,但不幸的是,我沒有在應用程序作用域和會話作用域bean之間運行它。在應用程序範圍的bean之間它工作得很好。 – Richard

相關問題