gpt4 book ai didi

java - 为什么我不能使用调度程序安排固定延迟任务

转载 作者:行者123 更新时间:2023-11-29 12:44:24 25 4
gpt4 key购买 nike

我想使用 Java 的 ScheduledExecutorService 来安排一个延迟服务,以在给定到期日期的情况下删除数据库中的一些行。但我发现即使在指定的到期日期之后,数据库中的行也不会被删除。所以计划任务没有执行。我的代码如下:

public int addNewGroup(final String groupName, Category category,
Timestamp expireDate) {

String sqlQuery = "INSERT INTO Groups (name, category, expireDate) VALUES (?, ?, ?)";
int numRows = jdbcTemplate.update(sqlQuery, new Object[] { groupName,
category.toString(), expireDate });

//schedule the deleting temporary group task
if (category == Category.temp) {
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = new Runnable() {
@Override
public void run() {
String query = "DELETE FROM Groups WHERE name=?";
jdbcTemplate.update(query, new Object[] {groupName});
}
};
scheduler.schedule(task, expireDate.getTime()-System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
return numRows;
}

这是我的测试代码,用于将一条记录插入具有到期日期的数据库:

public class StoregroupDaoTest {

private StoregroupDao dao;

@Before
public void setup() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
dao = context.getBean(StoregroupDao.class);
}

@Test
public void testAdd() {
String groupName = "ABC";
Category category = Category.temp;
@SuppressWarnings("deprecation")
Timestamp expireTime = new Timestamp(114, 8, 3, 16, 57, 0, 0); //2014-09-03 16:57:00
int numRows = dao.addNewGroup(groupName, category, expireTime);
}

}

记录已插入数据库。预计在到期时间后会被上面给出的计划任务删除。但是在指定的过期时间之后,当我查询DB时,该记录仍然存在并且没有被删除。所以看起来调度任务根本没有执行。这里有什么问题吗?

最佳答案

汤加,

我想到的第一件事是确保 ScheduledExecutor 在您期望它运行时正确地被调用和运行。我首先尝试通过将 DELETE 语句更改为“INSERT”语句来确认这一点,如果需要,可以将一些输出放入记录器中。一旦您验证了这一点,我将尝试使用您想要的参数通过 MySQL 工作台运行您的查询。一旦清除,我将尝试记录正在输入到您的 ScheduledExecutioner 的参数,并确保它们符合预期。一旦验证了所有这些,您的查询应该按预期执行! :-)

解决此问题的另一种方法是使用预定的过程调用。您可以做的是将上面描述的过程移植到 MySQL 的 PL,并让它每 n 秒运行一次。通过这样做,您将失去代码的可见性,但这也是每 n 秒运行一次过程的另一种巧妙方法。这样做的好处是,如果 ScheduledExecutor 开始变得复杂,它可能会出现并发问题,而使用 MySQL 过程来代替它会更容易、更直接。

您可以使用 mysql 调度程序每 5 秒运行一次。您可以在http://dev.mysql.com/doc/refman/5.1/en/create-event.html找到 sample

您可以通过以下方式在 MySQL 中调度存储过程:

 CREATE EVENT myevent
ON SCHEDULE EVERY 5 SECOND
DO
delete_rows_links();

如果您有任何疑问,请告诉我!

关于java - 为什么我不能使用调度程序安排固定延迟任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25653702/

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