Я хочу использовать 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);
}
}
Запись будет вставлена в БД. Ожидается, что он будет удален по заданной задаче, указанной выше, по истечении срока действия. Но после указанного времени истечения, когда я запросил БД, запись все еще существует и не удаляется. Похоже, что задача расписания не выполняется вообще. В чем проблема?
Hi Devarsh, спасибо за ваши предложения. Я помещаю некоторую распечатку журнала в планировщик, но кажется, что он не работает вообще, потому что по истечении срока действия нет никакой распечатки. Я также попытался использовать тот же запрос DELETE в моей БД, и он отлично работает. Использование хранимой процедуры в порядке, но я действительно хочу использовать Java-код для удаления записи. Я не знаю, почему планировщик задач не запускается вообще. – tonga
Эй, Тонга, да! Обычно это часть Harry с ScheduledExecuter, которая запускает ее, когда вы хотите:/вы можете проверить эти учебные пособия http://www.java2s.com/Code/JavaAPI/java.util.concurrent/ScheduledExecutorServicescheduleRunnablecommandlongdelayTimeUnitunit.htm и http : //tutorials.jenkov.com/java-util-concurrent/scheduledexecutorservice.html; убедитесь, что размер пула потоков также достаточно велик; пожалуйста, дайте мне знать, что вы делаете, и если у вас есть другие вопросы! :-) –
Я также распечатал параметр fed в планировщике: 'expireDate.getTime()'. Это правильно в терминах миллисезонов с эпохи. Так что действительно загадка. – tonga