我需要获得一些配置并连接到某处的外部资源/对象/系统并将其存储在应用程序范围内.
我可以看到两种设置应用程序的方法:
init()现有的servlet和所需的代码,并将所有构造的对象保留在同一个servlet中.init()来完成工作.然后存储创建的对象ServletContext以与其他servlet共享.以上哪种方法更好?有没有更好的方法在servlet之间共享对象?直接从彼此调用它们......?
我有一个部署到Tomcat服务器的WAR文件,其中一个类将在启动时调用,然后init()方法将安排一个计时器每5小时触发一次以执行某些任务.
我的init()代码如下所示:
public void init()
{
TimerTask parserTimerTask = new TimerTask() {
@Override
public void run() {
XmlParser.parsePage();
}
};
Timer parserTimer = new Timer();
parserTimer.scheduleAtFixedRate(parserTimerTask, 0, PERIOD);
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序运行没有问题,但当我使用/etc/init.d/tomcat7停止关闭Tomcat时,我检查日志(catalina.out)它有一个这样的条目:
严重:Web应用程序[/ MyApplication]似乎已经启动了一个名为[Timer-0]的线程,但未能阻止它.这很可能造成内存泄漏.
我明白这是由我安排计时器引起的,但我的问题是:
setDeamon为true,所以定时器不应该阻止Tomcat关闭,而不是继续运行?谢谢!
UPDATE
我根据一些搜索和DaveHowes的答案将我的代码更改为以下内容.
Timer parserTimer;
TimerTask parserTimerTask;
public void init()
{
parserTimerTask = new TimerTask() {
@Override
public void run() {
XmlParser.parsePage();
}
};
parserTimer = new Timer();
parserTimer.scheduleAtFixedRate(parserTimerTask, 0, PERIOD);
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
Logger logger …Run Code Online (Sandbox Code Playgroud) 在tomcat服务器sartup完成后,是否存在spring或tomcat中的任何机制,生命周期事件或回调(我已经配置了8个Web应用程序和队列,我希望在启动所有应用程序后将通知返回给每个应用程序.) .我知道spring有应用程序监听器,可以在初始化Web应用程序后使用.但我不能在我的情况下使用它,因为我希望在初始化所有Web应用程序后收到通知.
**已编辑***
我添加了实现tomcat的监听器来记录消息.但我绝对不知道在哪里挂钩这个听众.
我尝试使用spring创建这个bean,并且通过向web.xml添加监听器两者都不起作用.
这是我的代码
public class KPTomcatListener implements LifecycleListener {
private static final Logger LOG = LoggerFactory.getLogger(KPTomcatListener.class);
/**
* All the events of tomcat
* AFTER_START_EVENT,
* AFTER_STOP_EVENT,
* BEFORE_START_EVENT,
* BEFORE_STOP_EVENT,
* DESTROY_EVENT,
* INIT_EVENT,
* PERIODIC_EVENT,
* START_EVENT,
* STOP_EVENT
*/
private static int counter;
@Override
public void lifecycleEvent(LifecycleEvent arg0) {
String event = arg0.getType();
LOG.debug("Tomcat Envents: " + (++counter) + " :: " + event);
if(event.equals("AFTER_START_EVENT")) {
LOG.debug("Hey I've started");
}
}
}
Run Code Online (Sandbox Code Playgroud)