我已经使用以下代码在Java中实现了Timer
:
public static void main(String[] args) {
Timer timer = new Timer("XMLFileReader");
ReadXMLFile t = new ReadXMLFile();
timer.schedule(t, 0, 10 * 1000);
}
每隔10秒应下载并处理一个XML文件。
ReadXMLFile
是TimerTask
的子类,并实现方法run
。从外壳启动时,它工作正常。
关键是我必须通过网络启动/停止(即运行,取消)此计时器。也就是说,我应该能够使用以下操作参数将请求发送到我的glassfish(版本3.1.2.2 build 5)服务器:
http://localhost:8080/myDownloadXML?action=run
分别
http://localhost:8080/service?action=cancel
为此,我编写了一个如下类:
@Path("/service")
public class PollService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@GET
public Response poll(@QueryParam("action") String action) {
if (!action.equals("run") && !action.equals("cancel")) {
String msg = "wrong action (run | cancel) " + action + " " + action.length();
logger.error(msg);
return Response.status(HttpURLConnection.HTTP_BAD_REQUEST).entity(msg).build();
}
ReadXMLFile rXmlFile = new ReadXMLFile();
Timer timer = null;
if (action.equals("run")) {
timer = new Timer("XMLFileReader");
timer.schedule(rXmlFile, 0, delay * 1000);
return Response.ok("Running").build();
}
if (action.equals("cancel")) {
rXmlFile.cancel();
return Response.ok("Cancelling").build();
}
return Response.ok().build();
}
}
我可以
run
计时器,但是不能取消。据我所能想象的,cancel方法是错误的,因为它被应用于不是正在运行的对象。如何使用通过http的GET请求停止计时器?
最佳答案
没错,您尝试停止的计时器任务不是您启动的任务,因为您在每个HTTP GET上都创建了一个新任务。您需要以某种单例形式存储对任务的引用(在这种情况下,不是在每个请求上都创建一个对象)。一些选择:
我不确定PollService的配置和实例化方式,但是如果它是Web应用程序中的sigleton,则只需将计时器任务存储在class字段中即可。
如果PollService不是单例,则可以将引用存储在PollService(或其他类)的静态字段中。在这种情况下,您需要注意并发访问。