[英]How to start and end a timer or schedule job in tomcat servlet request dynamicly?
许多帖子说我们可以在ServletContextListener
使用ScheduledExecutorService
。 但是我想在某种情况下启动计时器,然后在另一种情况下将其停止。 例如,在客户端A的请求A中启动计时器,在客户端A或客户端B的请求B中停止计时器。我是否应该将计时器存储在会话中?
真正的问题是:我是根据网络请求创建订单的,如果24小时后仍未付款,我想取消订单。
为了清楚起见,我假设是这样的情况:我从Web请求中创建了一个对象,如果10秒钟后仍未处理该对象,我想删除该对象。 在这么短的时间内,像这样每5或8秒运行一次调度作业是否很好? 我想在10秒甚至1秒后精确地完成工作。
通常,这种事情将作为计划的后台任务完成,该任务将检查您的订单存储库中是否有已过期且需要取消的订单,您不需要为此使用HTTP会话。
在您的Order
类中,您可以添加一个属性,该属性是在请求A中创建时的时间戳,这将有助于查找它们。
然后创建一个调度程序:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
创建一个可运行的任务,该任务将检查需要取消的旧订单:
Runnable cancelUnpaidOrdersTask = new Runnable() {
public void run() {
// Your code to look for orders where the timestamp is older than 24 hours and then cancel them.
}
};
然后每分钟运行一次此任务-否则您通常会觉得需要根据自己的要求进行检查。
scheduler.scheduleAtFixedRate(cancelUnpaidOrdersTask, 0, 1, TimeUnit.MINUTES);
有关ScheduledExecutorService的Javadocs中的更多详细信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.