0

アプリケーション スコープ Bean でのデータ変更について EJB/Seam セッション Bean に通知するための最良の方法は何だろうと思っています。

私の使用例では、さまざまなサービスと通信してアプリケーション データを最新の状態に保つ中央 (アプリケーション スコープ) の seam2 Bean があります。何かが変更されたらすぐに、変更されたデータについて現在のすべてのユーザー セッションに通知し、できるだけ早くデータを取得できるようにする必要があります。これを達成するための最良の方法は何ですか?

Seam の @RaiseEvent、@Observer アプローチを試してみたのですが、ApplicationScope から SessionScope 内の Bean に通知することはできないようです。

JEE5、Seam2、EJB3.0 を使用しています

ありがとう

4

1 に答える 1

0

解決策が見つかった場合は、少しコツが必要です。

まず、プロジェクトに 2 つの新しいインターフェイスを作成しました。

public interface IDataProvider {

    public void register(IDataObserver observer);

    public void unregister(IDataObserver observer);
}

public interface IDataObserver {
    public void update();
}

2 番目のステップとして、Bean に 2 つのインターフェースを実装しました。

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

このアプローチは@In ではなくComponent.getInstance() を介して Seam コンポーネントを注入する場合にのみ機能することに注意してください。後者の場合、 update() が呼び出されるとすぐに、常に null を取得します!

于 2013-08-06T09:16:58.050 に答える