如何通知Seam会话bean有关已更改的数据

时间:2013-08-06 07:57:31

标签: java-ee ejb-3.0 seam java-ee-5 seam2

我想知道在应用程序范围的bean中通知EJB / Seam会话bean有关数据更改的最佳方法是什么。

在我的用例中,我有一个中央(应用程序作用域)seam2 bean,它与不同的服务进行通信,以使应用程序数据保持最新。 一旦发生任何变化,我需要通知所有当前用户会话有关已更改的数据,他们可以尽快将其提取。实现这一目标的最佳方法是什么?

我已经尝试过Seam的@RaiseEvent,@ Observer方法,但似乎无法从ApplicationScope通知SessionScope中的bean。

我正在使用JEE5,Seam2,EJB3.0

由于

1 个答案:

答案 0 :(得分:0)

如果找到了解决方案,需要一点技巧才能发挥作用。

首先,我在项目中创建了两个新接口:

public interface IDataProvider {

    public void register(IDataObserver observer);

    public void unregister(IDataObserver observer);
}

public interface IDataObserver {
    public void update();
}

作为第二步,我在我的bean中实现了两个接口。

@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注入接缝组件时才有效。在后面的例子中,一旦调用update(),你将永远为它们获取null!