Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何处理spring事件图?_Java_Spring_Events - Fatal编程技术网

Java 如何处理spring事件图?

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事件侦听器不提

我有一个Spring应用程序,它可以接收一个大的配置消息。我们使用ApplicationEventPublisher发布事件,并使用@EventListener注释订阅事件

不同的组件对消息的不同部分感兴趣,并基于消息创建各种对象。假设ConfigMsg具有属性A和B

X-侦听ConfigMsg,读取,构建XA

Y-侦听ConfigMsg,读取B,构建YB

Z-希望获取XA和YB,然后刷新其状态


如果X和Y会单独触发XA和YB,我如何通知Z XA和YB都可用?

简而言之,spring事件侦听器不提供任何高级功能,当您发送消息时,它会通知所有侦听器,仅此而已。从

将应用程序事件通知所有注册到此应用程序的匹配侦听器。事件可以是框架事件(例如ContextRefreshedEvent)或特定于应用程序的事件。 这样的事件发布步骤实际上是对多主机的移交,并不意味着同步/异步执行,甚至根本不意味着立即执行。鼓励事件监听器尽可能高效,单独使用异步执行来执行更长时间的运行和可能的阻塞操作

所以基本上你可以:

  • 创建3种不同类型的事件:“ConfigMsgAvailable”、“XaisBuild”、“YbisBuild”
  • X和Y都将侦听“ConfigMsgAvailable”类型的事件,一旦收到,将分别构建XA和YB
  • Z将侦听“xaisbuild”和“ybisbuild”事件,并将在内部存储产品(处于其内部状态),状态刷新将仅在XA和YB都可用时发生(我不知道“状态刷新”到底是什么,但假设它来自您的域,并且通常超出了问题的范围)
  • 因此,对于Z,您将得到类似的结果:

    @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());
    }
    }