Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
3 / 3 / 0
Регистрация: 22.10.2021
Сообщений: 217

Spring @Scheduled

22.07.2022, 23:56. Показов 1265. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите пожалуйста как работать с таймером в спринге? или легче юзать родной java тамер?
мне нужно в течении 15 минут опрашивать сторонний сервис с интервалом 1 минута.
опрос каждую минуту я осилил, но теперь мне нужно чтобы это срабатывало когда нужно, и работало ровно 15 минут.
так же нужна возможность остановить таймер раньше, если придет нужный ответ от стороннего сервиса.
как бы максимально правильно это сделать?
если я не понятно объяснил задайте вопрос для лучшего понимания.
вот мой класс, он пингует гугл каждую минуту, я хочу чтобы этот пинг начинался был по ивенту, а не с момента запуска приложения.
(время ивента не известно)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
@Slf4j
@Getter
@Setter
public class PingTask {
    @Value("${pingtask.url}")
    private String url;
 
    @Scheduled (fixedRateString = "${pingtask.period}")
    public void pingMe(){
        try{
            URL url = new URL(getUrl());
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            log.info("PING {}, OK: response code: {}", url.getHost(), connection.getResponseCode());
        }catch (IOException e){
            log.error("PING FILED!!!");
            e.printStackTrace();
        }
    }
}
Добавлено через 2 часа 9 минут
ну или для java.util.Timer нет в спринге альтернатив?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2022, 23:56
Ответы с готовыми решениями:

Spring @Scheduled
Разбираюсь с расписанием(@Scheduled) Вопрос как сделать так, что бы строка появлялась через определенное кол-во времени на экране, сейчас...

Spring Scheduled запуски задачи один раз только при старте web application
Как в Spring поставить задачу чтобы она выполнялась только один раз при запуске?

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями Spring MVC проект собирается нормально и...

7
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
23.07.2022, 08:46
Цитата Сообщение от UnrealCoder Посмотреть сообщение
родной java тамер
про него лучше вообще забыть

Цитата Сообщение от UnrealCoder Посмотреть сообщение
начинался был по ивенту
Цитата Сообщение от UnrealCoder Посмотреть сообщение
мне нужно чтобы это срабатывало когда нужно, и работало ровно 15 минут.
так же нужна возможность остановить таймер раньше, если придет нужный ответ от стороннего сервиса.
мне кажется @Scheduled не подходит под твои требования

1. ожидай событие свое.
2. https://stackoverflow.com/ques... n-number-o

fyi. вот это
Java
1
2
3
4
catch (IOException e){
        log.error("PING FILED!!!");
        e.printStackTrace();
}
можно заменить на
Java
1
2
3
catch (IOException e){
        log.error("PING FAILED!!!", e);
}
0
3 / 3 / 0
Регистрация: 22.10.2021
Сообщений: 217
23.07.2022, 14:35  [ТС]
а почему родной java таймер не годится можно чуть более подробно для развития моего?)

короче обьясню бизнес логику вдруг так будет понятнее:

клиент покупает товар, оплачивает его через сторонний сервис.
мое приложение, после инициализации ордера, проверяет, оплатил ли клиент на самом деле или просто запросил реквизиты для оплаты. проверяет в течении 15 минут, каждую минуту. если ответ от стороннего сервиса ОК, я выдаю товар клиенту, если по истечении 15 минут ответа нет - мое приложение закрывает ордер.

15 минут это не конечное число.... оплату на карту я жду 15 минут, а оплату биткойном жду 45минут..
0
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
23.07.2022, 19:42
Цитата Сообщение от UnrealCoder Посмотреть сообщение
а почему родной java таймер не годится можно чуть более подробно для развития моего?)
у таймера есть одна проблема. если в таске будет выброшена ошибка, то таймер больше никогда не запустится

If the timer's task execution thread terminates unexpectedly, for example, because its stop method is invoked, any further attempt to schedule a task on the timer will result in an IllegalStateException, as if the timer's cancel method had been invoked.

для примера:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SimpleTimerExample {
 
  public static class MyTimerTask extends TimerTask {
 
    public void run() {
      System.out.println("Tick tock");
      //throw new RuntimeException();
    }
  }
 
  public static void main(String[] args) {
 
    Timer timer = new Timer();
    TimerTask task = new MyTimerTask();
 
    timer.schedule(task, 1000, 2000);
  }
}
также в документации рекомендуют использовать классы из пакета java.util.concurrent

Java 5.0 introduced the java.util.concurrent package and one of the concurrency utilities therein is the ScheduledThreadPoolExecutor which is a thread pool for repeatedly executing tasks at a given rate or delay. It is effectively a more versatile replacement for the Timer/TimerTask combination, as it allows multiple service threads, accepts various time units, and doesn't require subclassing TimerTask (just implement Runnable). Configuring ScheduledThreadPoolExecutor with one thread makes it equivalent to Timer.

https://docs.oracle.com/en/jav... Timer.html

Добавлено через 4 часа 45 минут
Цитата Сообщение от UnrealCoder Посмотреть сообщение
мое приложение, после инициализации ордера, проверяет, оплатил ли клиент на самом деле или просто запросил реквизиты для оплаты. проверяет в течении 15 минут, каждую минуту. если ответ от стороннего сервиса ОК, я выдаю товар клиенту, если по истечении 15 минут ответа нет - мое приложение закрывает ордер.
Просто сделай одну проверку через 15 минут. Зачем лишний раз отправлять запросы

шедулер можешь запускать каждую минуту. будет искать в базе заказы, которые были создани больше 15 минут назад и еще не были оплачены, и не закрыты.

нашел например 3 заказа, сделал 3 запроса. если первые два были оплачены, то помечаешь их как оплаченные, третий закрываешь

если прям капец как надо каждую минуту и 15 попыток, то добавь новое поле в заказ, которое будет хранить в себе это количество попыток и дальше в шедулере обновляй
1
3 / 3 / 0
Регистрация: 22.10.2021
Сообщений: 217
04.08.2022, 17:08  [ТС]
поизучав инфу понял что мне подходит только ScheduledThreadPoolExecutor
-он не привязан к системным часам
-он не только перехватывает исключения во время выполнения, но и позволяет обрабатывать их
-он настраивается с любым количеством потоков (хотя мое приложение однопоточное)

если кто то имел с ним дело подскажите могу ли я там задавать имя для таска?

исходя из моей задачи из первого поста если в кратце:
после каждого заказа, я задаю таймер 15 минут, и один раз через 15 минут делаю запрос на сторонне API, независимо от ответа мне нужно выполнить бизнес логику(ту или иную) и закрыть таймер.
в эти 15 минут пользователь может отменить заказ и это так же должно будет остановить таймер.

как бы мне такое организовать? создавать каждый раз Runnable с номером ордера?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
04.08.2022, 17:40
ты можешь сделать таску, которая будет, например, раз в минуту ходить в бд и смотреть, есть ли какие-то действия, которые надо выполнить, соответственно, если есть - выполнит.
Останавливать саму таску при этом не требуется - достаточно в бд поменять статус - типа Done.

т.е. пользователь приходит, создает заказ, ты его кладешь в базу, ставишь статус типа TO_BE_PROCESSED, ставишь creationTime.
запускается твой скедулер, достает из бд заказ, смотрит, что он создан менее 15 минут назад, занчит пока не надо ниче делать. Видит, что другой заказ создан более 15 минут назад и статус TO_BE_PROCESSED, обрабатываешь его, как надо, ставишь статус DONE... PROFIT
1
3 / 3 / 0
Регистрация: 22.10.2021
Сообщений: 217
04.08.2022, 20:59  [ТС]
да заказы безусловно у меня в базе и имеют поле creationtime и поле orderstatus.
впервые сталкиваюсь с такой задачей поэтому подытожу понятое:

Использую строго ScheduledThreadPoolExecutor либо аннотацию спринга @Scheduled (притом это для меня более предпочтительно, хотелось бы проект базировать именно на возможностях спринга)

мой Scheduler каждую минуту берет из базы заказы со статусом "НЕОПЛАЧЕНО" и проеряет их creationtime и currenttime системы (в базе данных время создания записи заказа берется из системного времен сервера где крутится прога??).
Если разница по времени 15 минут, то запрашиваю сторонее API на проверку/подтверждение и выставляю ордеру(ордерам) статус "ОТМЕНЕН" или "ОПЛАЧЕН". Так для каждого ордера на сторонее API для подтверждения будет послан только один запрос.

Изменить статус заказа все эти 15 минут может и юзер нажав на кнопку во вьюшке типо "я оплатил", тем самым послав запрос на сторонее API, если по API придет подтверждение - ставлю заказу статус "ОПЛАЧЕНО" и выдаю товар. Если нет подтверждения со стороннего API - пишу об этом юзеру и ждем дальше.

так работаем?
0
3 / 3 / 0
Регистрация: 22.10.2021
Сообщений: 217
07.08.2022, 21:27  [ТС]
подскажите, мой шелдулер должен эмитировать действия пользователя и направлять по результатам проверок запрос на контроллер?

или как то через спринговские ивенты лучше действовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2022, 21:27
Помогаю со студенческими работами здесь

Перевод проекта из Spring Maven в обычный Spring MVC
Здравствуйте. Подскажите, реально ли взять готовый проект, например -...

задания по spring core и spring mvc для новичков
Какие задания можно предложить новичкам для выполнения после знакомства их с spring core и mvc ?

Spring Boot VS Tomcat+Spring - что выбрать?
Всем доброго дня! Я наверное еще из старой школы - пилю мелкие проект на Spring + Tomcat... Но хотелось бы чего-то нового ))) ...

Spring: а как вы разрешаете зависимости для spring ?
Прикручиваю авторизацию к своему мини-серверу и таки понимаю что я 5 минут ищу решение и 15 минут ищу куда переехала вон та библиотека в...

Jetty embedded + Spring MVC + Spring Security
Добрый день. По роду работы приходилось писать на JavaSE, в том числе и сложные клиент/серверные программы. Использовал Netty, Apache...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru