2012-07-23 71 views
0

我有一个listener project,我想实现一个web版本。我需要它在部署后持续运行。换句话说,只要应用程序部署到Apache Tomcat 7.0.14.0上,应立即开始监听/连续运行,而不会影响其他Web应用程序。这可能吗?在部署中持续运行类

+1

你的意思是一个'ServletContextListener'? – 2012-07-23 07:55:28

+0

是的,但它有可能让它在后台运行?如果你尝试运行index.jsp,它只会在'contextInitialized'进程完成后才在浏览器中打开(即使你在一个'new Thread()'运行进程。 – ThreaT 2012-07-23 08:13:16

+0

并非如此 - 如果你运行在一个单独的线程中,contextInitialized方法将会返回,并且所有东西都会像平常一样继续 – Bozho 2012-07-23 08:23:52

回答

1

从您所描述的内容看,Tomcat希望ServletContext侦听器能够完成,然后再进入下一个部署阶段。在这种情况下,您可以将您希望发生在后台的工作放到Runnable类中。

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); 
     } 
    } 
} 

,并设置关闭使用监听器内的ExecutorService:

MyListener.java

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> 

Download的例子

1

你忘了启动线程

@Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     Thread th = new Thread(); 
.... 
th.start(); 
} 

但随着ExecutorService的解决办法是安静的更好!

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

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

哦,当然,我错过了原来的帖子。 – 2012-07-23 12:42:45