Spring,JSF,如何在来自两个不同会话的bean之间发送事件

Spring,JSF,如何在来自两个不同会话的bean之间发送事件,spring,Spring,我想在不同会话实例的bean之间发送事件或消息 发送事件的服务: 处理事件的Bean: 假设我们有两个登录用户。因此,创建了两个会话(会话1和会话2)。会话1和会话2有自己的事件处理程序。 在methodA之后,调用事件发送 现在,我想通过session1和session2中的EventHandler对象中的handleFun方法来处理此事件。没有什么特别之处-因为您使用messanger注册了EventHandler,您可以让它向它们发送事件。由于您使用this注册EventHandler,因

我想在不同会话实例的bean之间发送事件或消息

发送事件的服务:

处理事件的Bean:

假设我们有两个登录用户。因此,创建了两个会话(会话1和会话2)。会话1和会话2有自己的
事件处理程序
。 在
methodA
之后,调用事件发送


现在,我想通过session1和session2中的
EventHandler
对象中的
handleFun
方法来处理此事件。

没有什么特别之处-因为您使用
messanger
注册了
EventHandler
,您可以让它向它们发送事件。由于您使用
this
注册
EventHandler
,因此不应干扰作用域代理(如果您使用它们)

但是,请注意以下几点:

  • 当会话被销毁时,不要忘记注销
    EventHandler
    (例如,在
    @PreDestroy
    方法中)
  • 注意线程安全
  • 如果您的
    EventHandler
    引用了其他
    会话
    作用域bean,这些bean使用作用域代理,并且您在
    handleFun()中使用它们,那么您将遇到问题。由于
    handleFun()
    是在会话上下文之外执行的,
    session
    代理后面的作用域bean将不可用

它没有什么特别之处-因为您向
messanger
注册了
事件处理程序
,所以您可以让它向他们发送事件。由于您使用
this
注册
EventHandler
,因此不应干扰作用域代理(如果您使用它们)

但是,请注意以下几点:

  • 当会话被销毁时,不要忘记注销
    EventHandler
    (例如,在
    @PreDestroy
    方法中)
  • 注意线程安全
  • 如果您的
    EventHandler
    引用了其他
    会话
    作用域bean,这些bean使用作用域代理,并且您在
    handleFun()中使用它们,那么您将遇到问题。由于
    handleFun()
    是在会话上下文之外执行的,
    session
    代理后面的作用域bean将不可用

感谢您的快速回复。但是我不确定我是否理解你最后的意思。我试着根据你的提示编写简单的应用程序,但我有一个奇怪的问题。也许这正是你在上次建议中写的。在handle fun中,我添加了“FacesContext.getCurrentInstance().getViewRoot().get(“myExistingBean”)),但它不起作用。它能与您的第三个建议联系起来吗?@Lehu:是的,我认为这是同一点。因为您在不同请求(与不同会话关联)的范围内调用
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)
    {   ... 
    }
 }