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

Java 如何在tomcat启动时启动新线程,java,multithreading,tomcat,servlets,Java,Multithreading,Tomcat,Servlets,在现有项目中,我希望在tomcat启动时启动一个新线程。在新的线程中,我将设置一个计时器,并每隔5分钟调用一次web服务 我不知道在哪里可以创建这个线程,以及如何在线程内执行方法 是否有用于此的web.xml配置?还是别的什么?谢谢。您有几个选择 分别在contextInitialized和contextDestroyed方法中使用和启动和停止线程 在或中,分别在init和destroy方法中启动和停止线程 如果您不知道Thread类是如何工作的,请阅读该类的javadoc。创建自己的Runna

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

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


是否有用于此的web.xml配置?还是别的什么?谢谢。

您有几个选择

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

在或中,分别在init和destroy方法中启动和停止线程

如果您不知道Thread类是如何工作的,请阅读该类的javadoc。创建自己的Runnable实现,并将其传递给线程,然后启动它


另一方面,不要自己管理线程。使用。

您有几个选择

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

在或中,分别在init和destroy方法中启动和停止线程

如果您不知道Thread类是如何工作的,请阅读该类的javadoc。创建自己的Runnable实现,并将其传递给线程,然后启动它


另一方面,不要自己管理线程。使用一个。

现在我真的不认为当您拥有java.util.concurrent包中的ExecutorService时,您真的需要创建一个像这样的新线程

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

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

此外,web.xml中的块中有1将迫使servlet的init在Tomcat启动时立即发生,而不是等待第一个请求到达。如果您想从init生成后台线程,这将非常有用。

现在我真的认为,当您拥有java.util.concurrent包中的ExecutorService时,您真的不需要创建这样的新线程

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

<listener>
   <listener-class>com.techidiocy.IdiotContextListener</listener-class>
</listener>
此外,web.xml中的块中有1将迫使servlet的init在Tomcat启动时立即发生,而不是等待第一个请求到达。如果您想从init生成后台线程,这非常有用。

您可以使用

实例 本例的项目结构为:

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表达式,您可以用它来构建它

web.xml

我希望这能帮助你。祝你好运

你可以用它来做

实例 本例的项目结构为:

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表达式,您可以用它来构建它

web.xml


我希望这能帮助你。祝你好运

为了好奇为什么你需要一个线程,你可以写一个作业,有很多可用的调度程序框架,例如我最喜欢的Quartz-谢谢好奇为什么你需要一个线程,你可以写一个作业,有很多可用的调度器框架,例如我最喜欢的Quartz-Thankso使用ServletContextListener、Servlet或filter有什么区别?我是这个行业的新手,谢谢你的耐心,这真的很有帮助。servlet和过滤器处理请求。ServletContextListener对于设置整个应用程序和管理对象的生命周期非常有用。那么ServletContextListener始终是应用程序范围?我在一个现有的项目中看到,有人在web.xml中对侦听器写了一条评论,它说sessionlisteners,这是错误的吗?或者他是指别的什么?谢谢。ServletContextListener附加到应用程序上下文的生命周期。有许多不同类型的听众。HttpSessionListener附加到HttpSession的生命周期。看。哦,我看到他们使用不同的接口。我还有一个问题。我创建了一个应用程序上下文范围侦听器,并使用ExecutorService执行Runnalbe类。现在,如果我想在应用程序范围内维护一个静态映射,并使它可以从servlet内部的整个applicationlike中访问。我应该在哪里创建这个静态映射,以及如何访问它。它应该在Runnable类中?还是仅仅在听众中?非常感谢。那么使用ServletContextListener、Servlet或filter有什么区别呢?我是这个行业的新手,谢谢你的耐心,这真的很有帮助。servlet和过滤器处理请求。ServletContextListener对于设置整个应用程序和管理对象的生命周期非常有用。那么ServletContextListener始终是应用程序范围?我看到在一个现有的项目中,有人在web.xml中对侦听器写了一条评论,
它说会话听众,这是错误的吗?或者他是指别的什么?谢谢。ServletContextListener附加到应用程序上下文的生命周期。有许多不同类型的听众。HttpSessionListener附加到HttpSession的生命周期。看。哦,我看到他们使用不同的接口。我还有一个问题。我创建了一个应用程序上下文范围侦听器,并使用ExecutorService执行Runnalbe类。现在,如果我想在应用程序范围内维护一个静态映射,并使它可以从servlet内部的整个applicationlike中访问。我应该在哪里创建这个静态映射,以及如何访问它。它应该在Runnable类中?还是仅仅在听众中?非常感谢。所以使用servlet是另一种解决方案,对吗?以太ServletContextListener或servlet,那么有什么不同呢?如果创建一个线程,为什么要使用ExecutorService?所以使用servlet是另一个解决方案,对吗?以太ServletContextListener或servlet,那么有什么不同呢?如果创建单个线程,为什么要使用ExecutorService?
<?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>