如何在tomcat启动时启动新线程

时间:2013-08-08 21:05:39

标签: java multithreading tomcat servlets

在现有项目中,我想在tomcat启动时启动一个新线程。在新的主题中,我会做一些事情,比如设置一个计时器,每5分钟调用一次web服务。

我不知道在哪里可以创建这个线程,以及如何在线程内执行一个方法。

是否有针对此的web.xml配置?或者是其他东西?谢谢。

3 个答案:

答案 0 :(得分:4)

您有几个选择。

使用ServletContextListener分别在contextInitialized()contextDestroyed()方法中启动和停止线程。

ServletFilter分别以init()destroy()方式启动并停止该主题。

如果您不知道Thread类是如何工作的,请阅读课程'javadoc here。创建自己的Runnable实现,并将其传递给Thread,然后传递给start()

相关说明,请勿自行管理。使用ExecutorService

答案 1 :(得分:3)

这些天我真的不认为你真的需要创建一个像这个new Thread()的新线程,如果ExecutorService包中的java.util.concurrent可以随时使用。

要启动新线程,您可以在web.xml中定义contextListener,如下所示 -

<listener>
   <listener-class>com.techidiocy.IdiotContextListener</listener-class>
</listener>

这个监听器的定义将是这样的 -

public class IdiotContextListener implements ServletContextListener {

private IdiotThreadClass idiotThread= null;

public void contextInitialized(ServletContextEvent sce) {
    //Your logic for starting the thread goes here - Use Executor Service
}

public void contextDestroyed(ServletContextEvent sce){
   //Your logic for shutting down thread goes here
  }
}

此外,在<load-at-startup>1</load-at-startup>的{​​{1}}块中<servlet>将强制您的servlet的init()在Tomcat启动时立即发生,而不是等待第一个请求到到达。如果要从web.xml

生成后台线程,这非常有用

答案 2 :(得分:2)

您可以使用Quartz执行此操作。

实施例

此示例的项目结构是:

C:.
|
+---src
|   |   quartz.properties
|   |   quartz_data.xml
|   |
|   \---org
|       \---paulvargas
|           \---test
|               \---quartz
|                       TestJob.java
|
\---WebContent
    \---WEB-INF
        |   web.xml
        |
        \---lib
                jta-1.1.jar
                log4j-1.2.17.jar
                quartz-2.1.5.jar
                slf4j-api-1.6.5.jar
                slf4j-log4j12-1.6.5.jar

<强> TestJob.java

此文件可能包含对WebService的调用。

package org.paulvargas.test.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TestJob implements Job {

    @Override
    public void execute(final JobExecutionContext ctx) 
            throws JobExecutionException {
        System.out.println("Call to WebService");
    }

}

<强> quartz_data.xml

在此文件中,您放置了一个cron表达式(您可以使用http://www.cronmaker.com/

构建它
<?xml version="1.0" encoding="UTF-8"?>

<job-scheduling-data
    xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_2_0.xsd"
    version="1.8">

    <schedule>
        <job>
            <name>TestJob</name>
            <job-class>org.paulvargas.test.quartz.TestJob</job-class>
        </job>
        <trigger>
            <cron>
                <name>TestJob</name>
                <job-name>TestJob</job-name>
                <cron-expression>0 0/5 * 1/1 * ? *</cron-expression>
            </cron>
        </trigger>
    </schedule>

</job-scheduling-data>

<强> quartz.properties

# ----------------------------- Threads --------------------------- #
org.quartz.threadPool.threadCount=5

# ----------------------------- Plugins --------------------------- #
org.quartz.plugin.jobInitializer.class=org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin

<强>的web.xml

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

    <listener>
        <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
    </listener>

</web-app>

我希望这可以帮到你。祝你好运!