【问题标题】:How to make spring servlet load-on-startup wait after tomcat jndi (global resources) are loaded加载tomcat jndi(全局资源)后如何使spring servlet load-on-startup 等待
【发布时间】:2016-10-04 14:26:49
【问题描述】:

我有一个使用 load-on-startup = 1 调用的 Spring servlet,它需要一个数据库连接,但有时,连接为空并且 appLoader servlet 失败。连接为空,因为 tomcat 没有时间正确加载全局资源。

问题:如何让 Spring 等待 jndi 正确加载?我的意思是,以某种方式订购它。

肮脏的解决方案:在调用我的 appLoader 之前,让另一个 servlet 主动等待并等待工作连接...

【问题讨论】:

  • 你为什么不通过spring加载jdbc连接,它会确保它在服务需要时可用。您可以定义要通过 jndi 配置的 spring jdbc 连接,因此如果需要,您仍然可以使用部署描述符。
  • 我不能那样做,这是为了生产目的,我们这样做的方式是tomcat用c3p0加载数据库池

标签: spring tomcat servlets jndi


【解决方案1】:

1) <load-on-startup> 的工作是在部署时启动一个 servlet。它只是启动(starts)进程,之后它无法控制该 servlet。

启动的 servlet 的全部控制权在web container 手中。
可以使用 事件处理 机制以编程方式控制 Web 容器的行为。

2) 事件基本上是某事的发生。更改对象的状态称为事件。
2.1) 您可以使用 servlet 的 事件侦听器 处理 web container 的事件,并在部署项目时执行一些重要的任务,例如创建数据库表、创建数据库连接对象等。
javax.servletjavax.servlet.http包中有很多Event类和Listener接口。

您可以使用ServletContextListenerconnection object 存储在上下文属性中,然后从servlet 上下文中获取该连接对象。

以下是几个将数据库连接对象存储在 servlet 上下文中的示例。 example1example2example3

2.2) 可以使用spring框架的事件处理机制
在春季,您可以使用ContextStartedEvent 轮询您的数据库连接,该连接在ApplicationContext 启动时引发。
在这里,有一些春天events 的例子。

【讨论】:

  • 我看看,让你知道:)
  • 我添加了一个监听器,它还实现了 BeanDefinitionRegistryPostProcessor,在使用它之前主动等待数据库连接。我已经把它放在我的 web.xml 中的第一位
猜你喜欢
  • 2017-06-09
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多