Класс библиотеки Java для обработки запланированного выполнения “обратных вызовов”?

Существует функция gsub, которую вы можете использовать. Он просматривает строку с заданным шаблоном, а затем заменяет ее желаемым выводом.

gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
    fixed = FALSE, useBytes = FALSE)

Пример:

gsub("hello", "", a$text)

Затем, если хотите, вы можете сохранить вывод как новый столбец или новую переменную.

Есть некоторые дополнительные вещи с учетом того, что gsub чувствителен к регистру, а что нет, но их можно найти здесь . Это также имеет несколько дополнительных примеров.

7
задан oxbow_lakes 5 March 2009 в 11:44
поделиться

8 ответов

Если Ваши потребности просты, рассматривают использование java.util. Таймер:

public class TimerDemo {

  public static void main(String[] args) {
    // non-daemon threads prevent termination of VM
    final boolean isDaemon = false;
    Timer timer = new Timer(isDaemon);

    final long threeSeconds = 3 * 1000;
    final long delay = 0;
    timer.schedule(new HelloTask(), delay, threeSeconds);

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MINUTE, 1);
    Date oneMinuteFromNow = calendar.getTime();

    timer.schedule(new KillTask(timer), oneMinuteFromNow);
  }

  static class HelloTask extends TimerTask {
    @Override
    public void run() {
      System.out.println("Hello");
    }
  }

  static class KillTask extends TimerTask {

    private final Timer timer;

    public KillTask(Timer timer) {
      this.timer = timer;
    }

    @Override
    public void run() {
      System.out.println("Cancelling timer");
      timer.cancel();
    }
  }

}

Как был отмечен, ExecutorService java.util.concurrent предлагает более богатый API при необходимости в нем.

4
ответ дан 6 December 2019 в 08:17
поделиться

Я настоятельно рекомендую cron4j (уже упоминалось) вместо Quartz, если вам не нужны некоторые из более продвинутых и сложных функций Quartz. Cron4j хорошо фокусируется на том, что он должен делать, имеет приличную документацию и не является решением для кухонной раковины.

1
ответ дан 6 December 2019 в 08:17
поделиться

Кварц поиска

8
ответ дан 6 December 2019 в 08:17
поделиться

Если Ваши объекты знают точно отдельные моменты времени, которые они хотят быть выполненными, то Вы могли использовать a java.util.concurrent.ScheduledExecutorService. Затем они простой вызов:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
long timeToExecute = ... //read from DB? use CronTrigger?
long delayToExecution = timeToExecute - System.currentTimeMillis();
scheduler.schedule(aRunnable, delayToExecution, TimeUnit.MILLISECONDS);

Необходимо было бы только использовать Quartz если Вы хотите, чтобы сам планировщик обработал функциональность как, "выполняются каждые 5 секунд", или если Вы хотите сложное поведение вокруг пропущенного выполнения или персистентность журнала аудита выполнения.

Можно на самом деле тривиально снова использовать Кварц CronTrigger класс для получения "следующего времени выполнения". Класс абсолютно автономен и не зависит от того, чтобы быть вызванным из Quartz "контекст". После того как у Вас есть следующее время выполнения как a Date или long, можно просто использовать Java ScheduledExecutorService как выше

5
ответ дан 6 December 2019 в 08:17
поделиться

Кварц является большой и очевидной электростанцией в этой области, но существуют некоторые альтернативы для исследования.

Cron4j является достаточно достойной библиотекой, которая немного более легка, чем Кварц. Это предоставляет хорошую документацию и сделает то, что Вы хотите.

Вероятно, более интересный то, если Вы хотите пользоваться библиотекой, которая соответствует лучше библиотекам параллелизма Java (особенно Исполнители и ScheduledExecutors) затем, у HA-JDBC есть интерфейс CronExecutorService, реализованный его CronThreadPoolExecutor. Теперь, интересно, это имеет зависимость от Кварца (для обеспечения класса CronExpression), но я нахожу, что два вместе работают лучше, чем один только просто Кварц. Если Вы не хотите, чтобы большие зависимости, его легкое извлекли небольшое количество классов от Кварца и HA-JDBC, которые заставляют это произойти.

Так как Вы хотите что-то намного меньшее (просто заметил Ваше редактирование), захват CronExpression от Кварца и два класса HA-JDBC, которые я упомянул выше. Это сделает это.

4
ответ дан 6 December 2019 в 08:17
поделиться

Кварцевый планировщик обычно рекомендуется.

0
ответ дан 6 December 2019 в 08:17
поделиться

Не может верить java.util. За таймер проголосовали как ответ. Кварц является действительно намного лучшим выбором.

Большое преимущество кварца по java.util. Таймер - то, что с кварцем задания могут быть сохранены в дб. В результате один jvm может запланировать, и другой может выполниться. Также (очевидно), запрос выживает через перезапуски jvm.

0
ответ дан 6 December 2019 в 08:17
поделиться

Возможно, более интересно, если вы хотите использовать библиотеку, которая лучше сочетается с библиотеками параллелизма Java (особенно Executors и ScheduledExecutors), тогда HA-JDBC имеет интерфейс CronExecutorService, реализованный его CronThreadPoolExecutor. Интересно, что он зависит от Quartz (для обеспечения класса CronExpression), но я нахожу, что оба вместе работают лучше, чем только Quartz. Если вам не нужны большие зависимости, легко извлечь горстку классов из Quartz и HA-JDBC, которые делают это возможным.

Я просто хотел сказать, что я попробовал извлечь эти классы, и это сработало! Мне нужны были эти три класса:

  • CronExpression (quartz)
  • CronThreadPoolExecutor (ha-jdbc)
  • DaemonThreadFactory (ha-jdbc)

И мне пришлось сделать только эти незначительные изменения:

  • Удаление логгера из CronThreadPoolExecutor (он был создан, но никогда не использовался)
  • Перемещение константы YEAR_TO_GIVEUP_SCHEDULING_AT из CronTrigger в CronExpression

Я был в восторге от того, что не застрял в клубке зависимостей. Поздравляю авторов класса!

И это работает как чемпион.

0
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: