在现有项目中,我想在tomcat启动时启动一个新线程。在新线程中,我将设置一个计时器并每 5 分钟调用一次 Web 服务。
我不知道在哪里可以创建这个线程,以及如何在线程内执行方法。
是否有针对此的 web.xml 配置?或者是其他东西?谢谢你。
在现有项目中,我想在tomcat启动时启动一个新线程。在新线程中,我将设置一个计时器并每 5 分钟调用一次 Web 服务。
我不知道在哪里可以创建这个线程,以及如何在线程内执行方法。
是否有针对此的 web.xml 配置?或者是其他东西?谢谢你。
你有几个选择。
分别使用 aServletContextListener
和启动和停止线程contextInitialized()
和contextDestroyed()
方法。
在Servlet
或方法中分别Filter
启动和停止线程init()
。destroy()
如果您不知道课程是如何工作的,请在此处Thread
阅读课程的 javadoc 。创建您自己的 a 实现并将其传递给, 然后传递给它。Runnable
Thread
start()
在相关说明中,不要自己管理线程。使用ExecutorService
.
这些天来,我真的不认为你真的需要创建一个像这样的新线程,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>
的<servlet>
块中包含web.xml
将强制您的 servlet 的 init() 在 Tomcat 启动后立即发生,而不是等待第一个请求到达。如果您想从中生成后台线程,这很有用init().
你可以用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>
我希望这可以帮助你。祝你好运!