Java 在部署时连续运行类

Java 在部署时连续运行类,java,tomcat,Java,Tomcat,我想实现一个web版本的。我需要它在部署时持续运行。换句话说,一旦应用程序部署到Apache Tomcat 7.0.14.0上,它就应该立即开始监听/连续运行,而不会影响web应用程序的其余部分。这可能吗?根据您的描述,Tomcat似乎希望ServletContext侦听器在进入下一个部署阶段之前完成。在这种情况下,您可以将希望在后台进行的工作放入一个可运行的类中 RunClassOnDeployment.java package web.deployment; import javax.se

我想实现一个web版本的。我需要它在部署时持续运行。换句话说,一旦应用程序部署到Apache Tomcat 7.0.14.0上,它就应该立即开始监听/连续运行,而不会影响web应用程序的其余部分。这可能吗?

根据您的描述,Tomcat似乎希望ServletContext侦听器在进入下一个部署阶段之前完成。在这种情况下,您可以将希望在后台进行的工作放入一个可运行的类中

RunClassOnDeployment.java

package web.deployment;

import javax.servlet.ServletContext;

public class RunClassOnDeployment implements Runnable {

    ServletContext myServletContext; // in case you need the servelet context

    RunClassOnDeployment(ServletContext sc) {
           myServletContext = sc;
    }

    public void run() {
       Thread th = new Thread();
        try {
            for (int i = 1; i <= 100; i++) {
                System.out.println(i);
                th.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("Thread interrupted! " + e);
        }
    }
}
package web.deployment;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("ServletContextListener destroyed");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(new RunClassOnDeployment(arg0.getServletContext()));
    }
}
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
         xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <listener>
        <listener-class>web.deployment.MyListener</listener-class>
    </listener>
</web-app>

web.deployment.MyListener

示例

您忘记启动线程

 @Override
    public void contextInitialized(ServletContextEvent arg0) {
        Thread th = new Thread();
....
th.start();
}
但是Executor服务的解决方案更好

而且。。。如果需要,您应该自动启动应用程序

<load-on-startup>100</load-on-startup>
100

你是说一个
ServletContextListener
?是的,但是它可以在后台运行吗?如果您尝试运行index.jsp,它将仅在
contextInitialized
进程完成后在浏览器中打开(即使您在
新线程()中运行进程)
。这不是真的-如果在单独的线程中运行,contextInitialized方法将返回,并且一切都将正常进行。
Thead.sleep
是一个静态方法,因此当调用
th.sleep()时
您实际上并没有告诉
th
睡眠,而是告诉当前线程。因此循环需要3秒钟。编译器可能会就此向您发出警告。