【问题标题】:Can I ensure that one of my Spring ApplicationListeners gets executed last?我可以确保我的 Spring ApplicationListener 之一最后执行吗?
【发布时间】:2012-06-09 12:52:15
【问题描述】:

我有几个服务正在侦听 Spring 事件以更改我的底层数据模型。这些都通过实现ApplicationListener<Foo> 来工作。一旦所有Foo 监听器修改了底层数据模型,我的用户界面需要刷新以反映更改(想想fireTableDataChanged())。

有没有办法确保Foo 的特定侦听器总是最后一个?或者有什么方法可以在所有其他侦听器完成后调用函数?我正在使用基于注释的布线和 Java 配置,如果这很重要的话。

【问题讨论】:

  • 您可以尝试在每个听众中实现Ordered 并适当调整顺序吗?
  • @TomaszNurkiewicz 看起来很有希望,我马上试试。
  • @TomaszNurkiewicz 关心你把它放在一个答案中,这样我就可以给你荣誉了吗?效果很好!
  • 完成了,很高兴能帮上忙。你能确定我没有弄乱顺序吗(最低的在前,而不是最后)?
  • @TomaszNurkiewicz 是的,最小的整数是最高优先级。 Ordered.LOWEST_PRECEDENCE 是 Integer.MAX_VALUE。

标签: java spring dependency-injection event-handling


【解决方案1】:

所有实现ApplicationListener 的bean 也应该实现Ordered 并提供合理的订单价值。值越低,你的监听器就会越早被调用:

class FirstListener implements ApplicationListener<Foo>, Ordered {
    public int getOrder() {
        return 10;
    }
    //...
}

class SecondListener implements ApplicationListener<Foo>, Ordered {
    public int getOrder() {
        return 20;
    }
    //...
}

class LastListener implements ApplicationListener<Foo>, Ordered {
    public int getOrder() {
        return LOWEST_PRECEDENCE;
    }
    //...
}

此外,您可以实现 PriorityOrdered 以确保始终首先调用您的一个侦听器。

【讨论】:

  • auth 事件监听器的顺序是否可能被忽略?我有CustomAuthListener implements ApplicationListener&lt;AbstractAuthenticationEvent&gt;, Ordered,但从未调用过return LOWEST_PRECEDENCE。幸运的是我只需要听InteractiveAuthenticationSuccessEvent 而不是AuthenticationSuccessEvent 来解决我的问题。
  • 我希望我能按时找到这个答案。所以记住所有的bean都应该实现Ordered。否则,即使在 LOWEST_PRECEDENCE Bean 之后,也会在订购一次之后执行
猜你喜欢
  • 2011-02-28
  • 2012-06-12
  • 1970-01-01
  • 2023-02-15
  • 2014-07-30
  • 2012-01-28
  • 2023-03-04
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多