gpt4 book ai didi

java - 如何通过网络管理计时器/计时器任务

转载 作者:行者123 更新时间:2023-12-01 12:57:09 24 4
gpt4 key购买 nike

我使用以下代码在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。从 shell 启动时它工作正常。

重点是我必须通过网络启动/停止(即运行、取消)这个计时器。也就是说,我应该能够使用如下操作参数向 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();
}
}

我可以运行我的计时器,但无法取消它。据我所知,取消方法是错误的,因为它应用于一个不是正在运行的对象。

如何通过 http 使用 GET 请求来停止我的计时器?

最佳答案

你是对的,你试图停止的计时器任务不是你已经启动的任务,因为你在每个 HTTP GET 上创建了一个新任务。您需要将任务的引用存储在某种单例中(在此上下文中,不是在每个请求上创建的对象)。几个选项:

  • 我不确定 PollService 是如何配置和实例化的,但如果它是您网络应用中的 sigleton,您可以将计时器任务存储在类字段中。
  • 如果 PollService 不是单例,您可以将引用存储在 PollService(或其他类)的静态字段中。在这种情况下,您需要处理并发访问。

关于java - 如何通过网络管理计时器/计时器任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23783882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com