【问题标题】:How to trigger an event when all the controllers are ready in Spring Context?当 Spring Context 中的所有控制器都准备好时,如何触发事件?
【发布时间】:2013-07-15 07:30:20
【问题描述】:

我正在尝试在我的一个控制器的 PostConstruct 中执行代码。但是这个动作是这样的,它也会导致来自同一模块的另一个控制器被其他一些外部模块触发。我观察到当我们在 postConstruct 中的代码执行时,其他控制器还没有准备好。

我还尝试在 ContextRefreshed 和 ContextStarted 事件上使用 ApplicationContext 侦听器,但如果某些外部模块尝试联系它们,那么此时所有控制器似乎还没有准备好。

我错过了什么?当所有控制器都准备好当前模块时,是否有任何钩子可用于触发方法执行?

【问题讨论】:

    标签: java spring model-view-controller spring-mvc


    【解决方案1】:

    Context refreshed 事件应该可以工作,除非您使用 LAZY 初始化(默认情况下不启用)。

    确保监听正确的上下文事件。有两个(或更多)刷新事件 - 一个用于根上下文,一个用于每个 servlet 上下文。

    【讨论】:

    • 我尝试了 ServletContextListener 和 ApplicationListener 但外部模块对控制器的请求仍然给出 404 错误。可能您建议的方法实际上正在工作,但 servlet 容器似乎会阻止对其任何控制器的请求,直到事件处理程序本身完成它的工作。因此,在联系当前模块的任何控制器之前,我们目前依赖于外部模块中的一些线程睡眠延迟。
    • 我有一种感觉,您正在做其他事情,而不是您在问题中要求的内容。 “来自外部模块的请求”是什么意思?您是正确的,应用程序容器在完全初始化之前不会让 servlet 处理任何请求。但这与您的问题有什么关系?
    • 控制器初始化后我想运行的代码,会触发一些外部应用程序立即联系这个模块。
    • 这是一个有趣的用例...将尝试在晚上复制该行为。顺便提一句。你用的是什么服务器?
    • 我正在使用 Apache Tomcat
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多