在现有项目中,我想在tomcat启动时启动一个新线程。在新的主题中,我会做一些事情,比如设置一个计时器,每5分钟调用一次web服务。
我不知道在哪里可以创建这个线程,以及如何在线程内执行一个方法。
是否有针对此的web.xml配置?或者是其他东西?谢谢。
答案 0 :(得分:4)
您有几个选择。
使用ServletContextListener
分别在contextInitialized()
和contextDestroyed()
方法中启动和停止线程。
在Servlet
或Filter
分别以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>
我希望这可以帮到你。祝你好运!