我需要通过rootContext将bean管理的消息/事件发送到由mvcContext管理的bean。
我的网络应用程序包括: - RootContext(applicationContext):数据库,dao bean,服务bean,安全性等 - mvc-context(web.xml中的servlet条目):manage controllers,restcontroller和endpoint(websocket)
每次创建新行(在服务bean中)我都需要向所有活动的websocket会话广播。
我在服务bean中使用ApplicationEventPublisherAware在目标bean中发布事件和@EventListener来处理它:但事件不在rootContext之外广播。
如果我在mvcContext中移动服务bean,那没关系 但我需要rootContext中的服务bean,因为另一个组件使用它(其他servlet(web.xml中的servlet条目); spring-batch任务;等等...)
我该怎么办?
PS:抱歉英语不好
答案 0 :(得分:0)
您可以在子上下文中创建一个bean,将其自身注册为父上下文的侦听器,并在收到事件后将其重新发布到子上下文。
public class ContextBridgingApplicationListener implements ApplicationListener, ApplicationEventPublisherAware, ApplicationContextAware, SmartInitializingSingleton {
private ApplicationContext context;
private ApplicationEventPublisher publisher;
public void afterSingletonsInstantiated() {
ApplicationContext parent = context.getParent();
if (parent != null && parent instanceof ConfigurableApplicationContext) {
((ConfigurableApplicationContext) parent).addApplicationListener(this);
}
}
public void onApplicationEvent(ApplicationEvent evt) {
this.publisher.publishEvent(evt);
}
// Setters ommitted
}
Haven没有对它进行过测试,从我的头顶或多或少地打了它。但是将此bean放在子上下文中应该使它能够从父接收事件并将它们广播到子上下文。
注意: 这可能存在一个漏洞,那就是您可能会遇到事件循环。当孩子再次向父母发布时。所以你可能需要一个解决方案 ....