首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将更改的数据通知Seam会话beans

如何将更改的数据通知Seam会话beans
EN

Stack Overflow用户
提问于 2013-08-06 15:57:31
回答 1查看 440关注 0票数 0

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

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

我尝试过Seam的@RaiseEvent,@观察者方法,但似乎不可能从ApplicationScope通知SessionScope中的beans。

我使用的是JEE5、Seam2、EJB3.0

谢谢

EN

回答 1

Stack Overflow用户

发布于 2013-08-06 17:16:58

如果找到了一个解决方案,需要一些小技巧才能奏效。

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

代码语言:javascript
复制
public interface IDataProvider {

    public void register(IDataObserver observer);

    public void unregister(IDataObserver observer);
}

public interface IDataObserver {
    public void update();
}

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

代码语言:javascript
复制
@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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18074625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档