Spring,JSF,如何在来自两个不同会话的bean之间发送事件
我想在不同会话实例的bean之间发送事件或消息 发送事件的服务: 处理事件的Bean: 假设我们有两个登录用户。因此,创建了两个会话(会话1和会话2)。会话1和会话2有自己的Spring,JSF,如何在来自两个不同会话的bean之间发送事件,spring,Spring,我想在不同会话实例的bean之间发送事件或消息 发送事件的服务: 处理事件的Bean: 假设我们有两个登录用户。因此,创建了两个会话(会话1和会话2)。会话1和会话2有自己的事件处理程序。 在methodA之后,调用事件发送 现在,我想通过session1和session2中的EventHandler对象中的handleFun方法来处理此事件。没有什么特别之处-因为您使用messanger注册了EventHandler,您可以让它向它们发送事件。由于您使用this注册EventHandler,因
事件处理程序
。
在methodA
之后,调用事件发送
现在,我想通过session1和session2中的
EventHandler
对象中的handleFun
方法来处理此事件。没有什么特别之处-因为您使用messanger
注册了EventHandler
,您可以让它向它们发送事件。由于您使用this
注册EventHandler
,因此不应干扰作用域代理(如果您使用它们)
但是,请注意以下几点:
- 当会话被销毁时,不要忘记注销
(例如,在EventHandler
方法中)@PreDestroy
- 注意线程安全
- 如果您的
引用了其他EventHandler
作用域bean,这些bean使用作用域代理,并且您在会话
handleFun()中使用它们,那么您将遇到问题。由于
是在会话上下文之外执行的,handleFun()
代理后面的作用域bean将不可用session
messanger
注册了事件处理程序
,所以您可以让它向他们发送事件。由于您使用this
注册EventHandler
,因此不应干扰作用域代理(如果您使用它们)
但是,请注意以下几点:
- 当会话被销毁时,不要忘记注销
(例如,在EventHandler
方法中)@PreDestroy
- 注意线程安全
- 如果您的
引用了其他EventHandler
作用域bean,这些bean使用作用域代理,并且您在会话
handleFun()中使用它们,那么您将遇到问题。由于
是在会话上下文之外执行的,handleFun()
代理后面的作用域bean将不可用session
handleFun()
),所有依赖于特定于请求或特定于会话的上下文信息的功能将与该请求的上下文一起使用。因此,FacesContext.getCurrentInstance()
返回实际传入请求的FacesContext
。感谢您的快速回复。但我不确定我是否理解您上次的指示。我尝试根据您的提示编写简单的应用程序,但我遇到了奇怪的问题。可能正是您在上次建议中编写的。在handle fun中,我添加了“FacesContext.getCurrentInstance().getViewRoot().get(“myExistingBean”))并且它不工作。这和你的第三条建议有什么关系吗?@Lehu:是的,我想这是同一点。由于您在不同请求(与不同会话关联)的范围内调用了handleFun()
,因此所有依赖于特定于请求或特定于会话的上下文信息的功能都将与该请求的上下文一起使用。因此,FacesContext.getCurrentInstance()
返回实际传入请求的FacesContext
。
@Service
@Scope("singleton")
public class ServiceA
{
void methodA()
{
...
messanger.post(new ReloadColorsEvent());
}
}
@Bean
@Scope("session")
public class EventHandler()
{
@PostContruct
void registerEvents()
{
messanger.register(this);
}
void handleFun(ReloadColorEvent reloadColorEvent)
{ ...
}
}