Java 如何处理spring事件图?
我有一个Spring应用程序,它可以接收一个大的配置消息。我们使用ApplicationEventPublisher发布事件,并使用@EventListener注释订阅事件 不同的组件对消息的不同部分感兴趣,并基于消息创建各种对象。假设ConfigMsg具有属性A和B X-侦听ConfigMsg,读取,构建XA Y-侦听ConfigMsg,读取B,构建YB Z-希望获取XA和YB,然后刷新其状态Java 如何处理spring事件图?,java,spring,events,Java,Spring,Events,我有一个Spring应用程序,它可以接收一个大的配置消息。我们使用ApplicationEventPublisher发布事件,并使用@EventListener注释订阅事件 不同的组件对消息的不同部分感兴趣,并基于消息创建各种对象。假设ConfigMsg具有属性A和B X-侦听ConfigMsg,读取,构建XA Y-侦听ConfigMsg,读取B,构建YB Z-希望获取XA和YB,然后刷新其状态 如果X和Y会单独触发XA和YB,我如何通知Z XA和YB都可用?简而言之,spring事件侦听器不提
如果X和Y会单独触发XA和YB,我如何通知Z XA和YB都可用?简而言之,spring事件侦听器不提供任何高级功能,当您发送消息时,它会通知所有侦听器,仅此而已。从 将应用程序事件通知所有注册到此应用程序的匹配侦听器。事件可以是框架事件(例如ContextRefreshedEvent)或特定于应用程序的事件。 这样的事件发布步骤实际上是对多主机的移交,并不意味着同步/异步执行,甚至根本不意味着立即执行。鼓励事件监听器尽可能高效,单独使用异步执行来执行更长时间的运行和可能的阻塞操作 所以基本上你可以:
@Component // a singleton bean in spring
public class Z {
private XA xa; // = null initially
private YB yb; // = null initially
... internal state ...
public Z() {
// don't initialize anything
}
public void receiveXAAndTryRefreshState(XA xa) {
this.xa = xa;
tryRefreshState();
}
public void receiveYBAndTryRefreshState(YB yb) {
this.yb = yb;
tryRefreshState();
}
private void tryRefreshState() {
if(this.xa != null && this.yb != null) {
doActualRefresh();
}
}
}
然后放置2个事件侦听器,实际的Spring智能实现可能会因Spring版本而异,这里有一个选项:
@Component
public class XAIsBuiltEventListener implements ApplicationListener<XAIsBuilt> {
@Autowired
private Z z;
@Override
public void onApplicationEvent(AXIsBuilt event) {
z.receiveXAAndTryRefreshState(event.getXA());
}
}
@Component
public class YBIsBuiltEventListener implements ApplicationListener<YBIsBuilt> {
@Autowired
private Z z;
@Override
public void onApplicationEvent(YBIsBuilt event) {
z.receiveYBAndTryRefreshState(event.getYB());
}
}
@组成部分
公共类XAIsBuiltEventListener实现ApplicationListener{
@自动连线
私人Z Z;
@凌驾
ApplicationEvent上的公共无效(AxisBuild事件){
z、 ReceiveXa和TryRefreshState(event.getXA());
}
}
@组成部分
公共类YBIsBuiltEventListener实现ApplicationListener{
@自动连线
私人Z Z;
@凌驾
ApplicationEvent上的公共无效(YbisBuild事件){
z、 receiveYBAndTryRefreshState(event.getYB());
}
}