1

在现有项目中,我想在tomcat启动时启动一个新线程。在新线程中,我将设置一个计时器并每 5 分钟调用一次 Web 服务。

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

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

4

3 回答 3

4

你有几个选择。

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

Servlet或方法中分别Filter启动和停止线程init()destroy()

如果您不知道课程是如何工作的,请在此处Thread阅读课程的 javadoc 。创建您自己的 a 实现并将其传递给, 然后传递给它。RunnableThreadstart()

在相关说明中,不要自己管理线程。使用ExecutorService.

于 2013-08-08T21:09:13.677 回答
3

这些天来,我真的不认为你真的需要创建一个像这样的新线程,new Thread() 当你ExecutorServicejava.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><servlet>块中包含web.xml将强制您的 servlet 的 init() 在 Tomcat 启动后立即发生,而不是等待第一个请求到达。如果您想从中生成后台线程,这很有用init().

于 2013-08-08T21:13:20.253 回答
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

测试作业.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");
    }

}

石英数据.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>

石英属性

# ----------------------------- 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>

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

于 2013-08-08T21:47:25.047 回答