相关疑难解决方法(0)

使用特殊的自动启动servlet在启动时初始化并共享应用程序数据

我需要获得一些配置并连接到某处的外部资源/对象/系统并将其存储在应用程序范围内.

我可以看到两种设置应用程序的方法:

  • 覆盖init()现有的servlet和所需的代码,并将所有构造的对象保留在同一个servlet中.
  • 拥有某种初始化servlet并使用它init()来完成工作.然后存储创建的对象ServletContext以与其他servlet共享.

以上哪种方法更好?有没有更好的方法在servlet之间共享对象?直接从彼此调用它们......?

servlets initialization data-sharing

32
推荐指数
1
解决办法
1万
查看次数

关闭tomcat时停止计划的计时器

我有一个部署到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]的线程,但未能阻止它.这很可能造成内存泄漏.

我明白这是由我安排计时器引起的,但我的问题是:

  1. 我没有设置setDeamon为true,所以定时器不应该阻止Tomcat关闭,而不是继续运行?
  2. 我可以在我的应用程序中检测Tomcat是否会关闭并取消我的计时器?
  3. 我可以用什么其他解决方案来解决这个问题?

谢谢!

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)

java tomcat java-ee tomcat7

22
推荐指数
1
解决办法
3万
查看次数

tomcat服务器启动完成后回调

在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)

java spring tomcat tomcat6

3
推荐指数
2
解决办法
3911
查看次数