我有一个web应用程序,它在初始化ServletContext时从外部系统引导事件接收器。所有需要接收事件的组件都在侦听ServletContext属性事件,并将自己附加为侦听器。由于我不希望事件侦听器错过事件,所以我只想在所有侦听器被附加之后才启动事件源。
在Servlet2.5和3.0规范中,我找不到任何用于初始化的线程需求,所以我假设完全异步初始化模型,但是我注意到Tomcat会立即从setAttribute()方法触发setAttribute属性更改的事件。这意味着,如果所有其他servlet容器都这样做,我可以简化我的启动过程。
编辑:(按要求),下面是一个示例(我已经尝试尽可能地具体)。在我的web.xml中,我已经注册了:
)。
当
中的属性。
。
问题是我是否真的需要StartEventSourceFilter,还是保证在设置事件源属性(即属性侦听器不推迟)时,所有的使用者都会被附加。我关心Tomcat,Jetty和Websphere。
发布于 2012-01-11 17:21:14
由于没有人回答,我挖了一下,下面是我发现的:
Servlet3.0规范没有提到侦听器是内联通知还是异步通知,但它在第11章中提供了以下保证:
剩下的唯一问题是servlet-context属性侦听器是否总是与setter内联运行,还是有将它们排队的实现(比如将多个更改事件合并到同一个属性中)。我认为,合理的假设是,规范和所有实现的意图将内联地通知侦听器(并为Tomcat和Jetty确认了这一点)。
底线是:当从上下文init侦听器设置上下文属性时,可以合理地假定在setter方法返回时所有上下文属性侦听器都已经完成。规范没有显式地保证这一点,但是所有指定的约束和保证都指向这个方向。
https://stackoverflow.com/questions/8740950
复制相似问题