Ждать / спать до определенного времени (например, четверг в 10:59) в Java - PullRequest
0 голосов
/ 21 октября 2019

В настоящее время я использую селен в веб-боте для покупки предметов на сайте. Когда я ищу предмет, который хочу купить, и его не удается найти, я использую driver.navigate().refresh(), чтобы обновить страницу, чтобы увидеть, есть ли она там сейчас, она будет продолжать делать это, пока не найдет товар, когда он будет выпущен на странице. Тем не менее, я хочу запустить своего бота за несколько часов до выпуска продукта, который в настоящее время не работает, так как примерно через 30 секунд обновления страницы я забанен со страницы из-за программного обеспечения anti-ddos, которое они используют. Один из вариантов - увеличить задержку между обновлениями, однако мне нужно как можно быстрее отловить выпуск этого продукта, поэтому я пытаюсь найти способ, чтобы моя программа могла ждать / спать до 30 секунд до выхода, однако яизо всех сил пытается найти способ сделать это.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Я думаю, что вместо того, чтобы спать, вы должны взглянуть на запланированные задачи с выражениями cron в Spring ... таким образом, у вас нет заблокированного потока, который просто сидит там.

Запланированные задачи сSpring
Cron Expressions

1 голос
/ 21 октября 2019

Просто вызовите Thread.sleep с соответствующим количеством миллисекунд:

public static void main(String[] args) throws InterruptedException {
    long currentTime = System.currentTimeMillis();
    long releaseTime = currentTime + 1000 * 60 * 60 * 24 * 3; // 3 days

    Thread.sleep(releaseTime - currentTime);
}

Другой способ - использовать java.time классы:

public static void main(String[] args) throws InterruptedException {
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime release = LocalDateTime.of(2019, 10, 30, 13, 30);

    long sleepDuration = Duration.between(now, release).toMillis();
    TimeUnit.MILLISECONDS.sleep(sleepDuration);
}

Java 9 вводит новые методы длякласс Duration, такой как toSeconds(), toMinutes() и т. д.

Вы также можете рассмотреть возможность использования ScheduledExecutorService для планирования своих задач. Это особенно полезно, если у вас есть несколько задач для планирования и вы не хотите, чтобы для этого было заблокировано несколько потоков:

private static final ScheduledExecutorService service = new ScheduledThreadPoolExecutor(2);

private static ScheduledFuture<?> scheduleTask(Runnable task, LocalDateTime releaseTime) {
    Duration duration = Duration.between(LocalDateTime.now(), releaseTime);
    return service.schedule(task, duration.toSeconds(), TimeUnit.SECONDS);
}

В общем, чтобы спать до следующего четверга в 10:59, вы могли бы использоватьследующий код:

LocalDateTime release = LocalDateTime.now()
            .with(TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY))
            .withHour(10)
            .withMinute(59);

Duration duration = Duration.between(LocalDateTime.now(), release);
TimeUnit.MILLISECONDS.sleep(duration.toMillis());
...