Servlets JBossServlet启动依赖性

Servlets JBossServlet启动依赖性,servlets,jboss,wildfly,Servlets,Jboss,Wildfly,我有一个通过包jar(ServletA)提供的servlet,它依赖于ServletB从数据库加载的参数。我遇到的问题是Jboss似乎为servlet的初始化产生了单独的线程。虽然在日志中,我可以看到启动时加载定义的顺序是正确的,但ServletB读取数据库属性所花费的时间似乎导致ServletA在初始化时失败,并且无法获取属性,因为ServletB仍然很忙 ServletA是一个单例,它的初始化只运行一次,如果失败,就没有恢复。我无法控制ServletA,因此无法更改此行为 web.xml或J

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

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

web.xml或Jboss(wildfly)中是否有定义servlet启动依赖项的设置?我试图找到一种方法,让ServletA在初始化之前等待ServletB的init()完成

web.xml或Jboss(wildfly)中是否有定义servlet启动依赖项的设置?我试图找到一种方法,让ServletA在初始化之前等待ServletB的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>

ServletA
ServletA
com.stackoverflow.ServletA
1.
ServletB
ServletB
com.stackoverflow.ServletB
0
但是,根据的第10.12节,启动时加载只确定在每个servlet上调用init()方法的顺序。它保证在调用第一个servlet init之后调用下一个servlet init。但它不能保证在第一个init完成后调用下一个init


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

web.xml或Jboss(wildfly)中是否有定义servlet启动依赖项的设置?我试图找到一种方法,让ServletA在初始化之前等待ServletB的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>

ServletA
ServletA
com.stackoverflow.ServletA
1.
ServletB
ServletB
com.stackoverflow.ServletB
0
但是,根据的第10.12节,启动时加载只确定在每个servlet上调用init()方法的顺序。它保证在调用第一个servlet init之后调用下一个servlet init。但它不能保证在第一个init完成后调用下一个init


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

我在启动时加载类似于上面定义的内容。servlet启动的顺序是正确的。然而,尽管ServletB首先启动,但从数据库读取属性需要一些时间。当ServletA仍在读取时,它开始初始化并失败。@Phuthib,根据的第10.12节,启动时加载仅确定在每个servlet上调用init()方法的顺序。它保证在调用第一个init之后调用下一个servlet init。但这并不保证在第一次初始化完成后会调用下一次初始化。为了实现您的目标,您可以在servletB的init方法末尾设置一个标志,然后在servletA的init方法中等待该标志的设置。感谢您的响应,解决方案毕竟是在启动时加载的。我的代码在ServletB中时失败。我在启动时的加载与上面定义的类似。servlet启动的顺序是正确的。然而,尽管ServletB首先启动,但从数据库读取属性需要一些时间。当ServletA仍在读取时,它开始初始化并失败。@Phuthib,根据的第10.12节,启动时加载仅确定在每个servlet上调用init()方法的顺序。它保证在调用第一个init之后调用下一个servlet init。但这并不保证在第一次初始化完成后会调用下一次初始化。为了实现您的目标,您可以在servletB的init方法末尾设置一个标志,然后在servletA的init方法中等待该标志的设置。感谢您的响应,解决方案毕竟是在启动时加载的。我的代码在ServletB中时失败。