我想知道通知EJB/Seam会话bean关于应用程序范围的bean中的数据更改的最佳方法是什么。
在我的用例中,我有一个中央(应用程序范围的) seam2 bean,它与不同的服务通信,以使应用程序数据保持最新。一旦有任何变化,我需要通知我的所有当前用户会话有关更改的数据,他们可以尽快拿起它。实现这一目标的最佳方法是什么?
我尝试过Seam的@RaiseEvent,@观察者方法,但似乎不可能从ApplicationScope通知SessionScope中的beans。
我使用的是JEE5、Seam2、EJB3.0
谢谢
发布于 2013-08-06 17:16:58
如果找到了一个解决方案,需要一些小技巧才能奏效。
首先,我在项目中创建了两个新接口:
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注入seam组件时,这种方法才有效。在后一种情况下,一旦调用update(),您总是会得到它们的null!
https://stackoverflow.com/questions/18074625
复制相似问题