【发布时间】:2018-12-26 00:39:43
【问题描述】:
Spring事件机制支持通过@EventListener注解在Spring组件内发布应用事件和监听这些事件。但是,我在documentation 中找不到有关在特定范围内发送事件的任何信息。我对 Vaadin 的具体需求是:
- 在用户交互的上下文中,发送事件(例如登录事件)
- 此事件只能由同一
@UIScope中的 bean 使用,即不应影响其他用户 UI
这可能吗? 注意:这并不是 Vaadin 所特有的。我还可以询问如何使用 Spring web mvc 请求范围来完成。
【问题讨论】:
-
您有特定的用例吗?在我看来,这是不可能的,因为事件系统是用来分离生产者和消费者的。在这里你想要一个联轴器,为什么要使用它?即使您想使用@Async 进行异步处理,将处理数据的线程也不会是您用于启动进程的线程,因此上下文不会相同。我得到的解决方案是在事件中设置您需要的所有数据(来自任何上下文的 bean)并在流程端使用它。但请注意,当您异步处理数据时,某些 bean 可能已经调用了
@PreDestroy方法。 -
您或许可以尝试使用
@EventListener注释的condition属性(有关详细信息,请参阅here)。您基本上可以在 SpEL 中定义一个条件,该条件需要满足才能调用侦听器。 -
只是一个潜在的线索:你不能在事件中放置一个 UI-id 并有一个 UI 范围的过滤器来拒绝所有 ui_id 与过滤器预期不匹配的事件吗?
-
@SteffenHarbich 是的,我从来没有遇到过你的用例,但我觉得它很有趣,而且远非分裂头发;我很惊讶它还没有在标准 Spring 中处理。不过,也许有办法获得
ApplicationEventPublisherui-scoped。但我不确定 UI 范围的侦听器注册是否是防止太多侦听器执行单个检查的良好折衷。 -
@SteffenHarbich 顺便说一句,我测试了从 RestController 发布一个事件,并让一个请求范围的 bean 从两个并发的 httprequest 监听它(并发通过断点处理)。对于这两个事件,仅触发了范围为当前请求的侦听器。所以我认为 eventPublisher 可能已经被限定了。