我已经使用以下代码在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文件。 ReadXMLFileTimerTask的子类,并实现方法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(或其他类)的静态字段中。在这种情况下,您需要注意并发访问。

09-26 15:56