jbossservlet启动依赖关系



我有一个通过packages jar(servlet a)提供的servlet,它取决于servlet B从数据库加载的参数。我遇到的问题是Jboss似乎为servlet的初始化生成了单独的线程。虽然在日志中我可以看到启动时加载定义的顺序是正确的,但ServletB读取数据库属性所花费的时间似乎导致ServletA在初始化开始时失败,并且由于ServletB仍然繁忙而无法获取属性。

ServletA是一个单例,它的初始化运行一次,如果失败,就没有恢复。我无法控制Servlet A,因此无法改变这种行为。

web.xml或Jboss(wildfly)中是否有定义servlet启动相关性的设置?我正试图找到一种方法,让Servlet a在初始化之前等待Servlet B的init()完成。

web.xml或Jboss(wildfly)中是否有定义servlet启动相关性的设置?我正试图找到一种方法,让Servlet a在初始化之前等待Servlet B的init()完成。

是的,您可以在web.xml中使用参数load-on-startup来执行此操作。它指示加载servlet的顺序,编号较高的servlet在编号较低的servlet之后加载。

<servlet>
<servlet-name>ServletA</servlet-name>
<display-name>ServletA</display-name>
<servlet-class>com.stackoverflow.ServletA</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServletB</servlet-name>
<display-name>ServletB</display-name>
<servlet-class>com.stackoverflow.ServletB</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>

但是,根据servlet规范的10.12节,启动时的加载仅决定在每个servlet上调用init()方法的顺序。它保证在调用第一个servlet init之后调用下一个servlet init。但它不能保证在第一个init的完成之后会调用下一个init。

为了实现您的目标,您可以在servletB的init方法的末尾设置一个标志,然后在servletA的init方法中等待该标志的设置。例如,在servlet B的init方法末尾的临时文件夹中写入一个0字节的文件,然后在servlet a的init方法中等待创建该文件。

最新更新