9

Is there any method or API that I can use so that whenever I deploy a new WAR file, a part of code should execute or perhaps when Tomcat starts, the respective servlet should start or run some code continuously.

4

3 回答 3

13

恢复一个旧问题,因为唯一的答案没有显示任何示例。

为了在部署/取消部署 Web 应用程序 WAR 或启动/停止 Tomcat 时运行自定义代码,您需要:

  1. 实现ServletContextListener监听器及其方法contextInitialized()contextDestroyed().
  2. 让 Tomcat 知道你的实现。根据文档,您可以将实现类添加到部署描述符,使用 注释它,或者通过定义的方法WebListener之一注册它。addListener()ServletContext

这是一个示例(基于此帖子):

package com.example;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListener implements ServletContextListener {
    /** The servlet context with which we are associated. */
    private ServletContext context = null;

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        log("Context destroyed");
        this.context = null;
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        this.context = event.getServletContext();
        log("Context initialized");
    }

    private void log(String message) {
        if (context != null) {
            context.log("MyServletContextListener: " + message);
        } else {
            System.out.println("MyServletContextListener: " + message);
        }
    }
}

并将以下内容添加到web.xml(或者,使用WebListener注释或addListener()方法):

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    ...
    <listener>
        <listener-class>com.example.MyServletContextListener</listener-class>
    </listener>
</web-app>
于 2013-05-22T15:04:58.120 回答
6

您可以在 web.xml 中包含“ContextListener”。当 Webb 应用程序 WAR 即将部署/启动时,将创建此类的一个实例。

此代码可以启动一个线程,该线程将一直运行到应用程序部署完毕。

示例:http ://www.javafaq.nu/java-example-code-233.html

于 2011-03-17T07:55:11.240 回答
0

我找到了一种仅在应用程序(* .war)部署时运行一些代码的方法:它至少适用于使用 javax.ws.rs.core.Application 的带有 java servlet 的 jersey servlet。

文件 ApplicationConfig.java(见下文)中的应用程序包含一个方法 public getClasses,该方法在应用程序部署时调用。因此,在 getClasses 中添加代码会导致它在应用程序部署时执行。我注意到的唯一需要注意的是,奇怪的是这个函数被调用了两次,不知道为什么,所以我在 ApplicationConfig 类中添加了一个全局变量来了解我的代码是否已经运行。

这是我的解决方案:

package eu.oca;

import java.util.Set;
import javax.ws.rs.core.Application;

/**                                                                                                                             
 *                                                                                                                              
 * @author mattei                                                                                                               
 */
@javax.ws.rs.ApplicationPath("jersey")
public class ApplicationConfig extends Application {

    private boolean alreadyRun = false;

    @Override
    public Set<Class<?>> getClasses() {

        System.out.println("Sidonie : ApplicationConfig : getClasses : alreadyRun = " + String.valueOf(alreadyRun));
        alreadyRun = true;
        Set<Class<?>> resources = new java.util.HashSet<>();
        addRestResourceClasses(resources);
        return resources;
    }

    /**                                                                                                                         
     * Do not modify addRestResourceClasses() method.                                                                           
     * It is automatically populated with                                                                                       
     * all resources defined in the project.                                                                                    
     * If required, comment out calling this method in getClasses().                                                            
     */
    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(eu.oca.ResultatGeneralAF.class);
        resources.add(eu.oca.ResultatGeneralF.class);
        resources.add(eu.oca.ResultatMesuresAF.class);
        resources.add(eu.oca.ResultatMesuresF.class);
        resources.add(eu.oca.SidonieAccueilD.class);
        resources.add(eu.oca.SidonieWelcomeR.class);
    }

}
于 2017-02-24T09:52:25.067 回答