2014-09-03 1 views
0

Я хочу использовать 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); 
    } 

} 

Запись будет вставлена ​​в БД. Ожидается, что он будет удален по заданной задаче, указанной выше, по истечении срока действия. Но после указанного времени истечения, когда я запросил БД, запись все еще существует и не удаляется. Похоже, что задача расписания не выполняется вообще. В чем проблема?

ответ

1

Тонги,

Первое, что приходит на ум, чтобы убедиться, что ScheduledExecutor должным быть испробованы и работает, когда вы ожидаете, что для запуска. Сначала я попытаюсь подтвердить это, изменив инструкцию DELETE на инструкцию INSERT, и если хотите, введите некоторый вывод в ваш регистратор. После того, как вы проверили это, я попытался выполнить ваш запрос через Workbench MySQL с параметрами, которые вы хотите. Как только это очистится, я попытаюсь записать параметры, которые подаются в ваш ScheduledExecuter, и убедиться, что они как ожидалось. После того как вы проверили все эти данные, ваш запрос должен выполняться, как ожидалось! :-)

Другим способом решения этой проблемы является использование запланированных процедурных вызовов. Что вы можете сделать, так это то, что описанная выше процедура перенесена на PL вашего MySQL и запускайте ее каждые n секунд. Вы потеряете видимость кода, сделав это, но это еще один удобный способ запуска процедур каждые n секунд. Преимущество этого заключается в том, что ScheduledExecutor может иметь проблемы с параллелизмом, если он начинает становиться сложным, и просто проще и проще использовать вместо этого процедуру MySQL.

Вы можете использовать планировщик mysql для запуска его каждые 5 секунд. Вы можете найти образцы на http://dev.mysql.com/doc/refman/5.1/en/create-event.html

Вы можете запланировать хранимую процедуру в MySQL следующим образом:

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

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы!

+0

Hi Devarsh, спасибо за ваши предложения. Я помещаю некоторую распечатку журнала в планировщик, но кажется, что он не работает вообще, потому что по истечении срока действия нет никакой распечатки. Я также попытался использовать тот же запрос DELETE в моей БД, и он отлично работает. Использование хранимой процедуры в порядке, но я действительно хочу использовать Java-код для удаления записи. Я не знаю, почему планировщик задач не запускается вообще. – tonga

+0

Эй, Тонга, да! Обычно это часть Harry с ScheduledExecuter, которая запускает ее, когда вы хотите:/вы можете проверить эти учебные пособия http://www.java2s.com/Code/JavaAPI/java.util.concurrent/ScheduledExecutorServicescheduleRunnablecommandlongdelayTimeUnitunit.htm и http : //tutorials.jenkov.com/java-util-concurrent/scheduledexecutorservice.html; убедитесь, что размер пула потоков также достаточно велик; пожалуйста, дайте мне знать, что вы делаете, и если у вас есть другие вопросы! :-) –

+0

Я также распечатал параметр fed в планировщике: 'expireDate.getTime()'. Это правильно в терминах миллисезонов с эпохи. Так что действительно загадка. – tonga

 Смежные вопросы

  • Нет связанных вопросов^_^