|
|
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Всем привет. Есть заказ, есть исполнитель заказа. Когда заказ создается, запускается таймер, который в течении 5 минут ищет исполнителя. Если в течении этого времени исполнитель не найден, заказ отменяется. Заказов одновременно может быть много и получается, что под каждый из этих заказов должен запускаться отдельный таймер. Я так понимаю каждый такой таймер должен создаваться в отдельном потоке... В общем, как решаются подобные задачи? Может быть для этих целей есть хорошая библиотека, поделитесь опытом, пожалуйста. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2014, 12:23 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Нет смысла создавать каждый таймер в своём потоке. Так как "убить задачу" процесс, быстрый, то одного потока хватит с головой. На худой конец, сконфигуряете на пул из 2х потоков https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html Запускается процесс, для ней сабмитится runnable в ScheduledExecutorService. При запуске runable проверяет, если его процесс ещё активет, то убивает его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2014, 12:31 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНет смысла создавать каждый таймер в своём потоке. Так как "убить задачу" процесс, быстрый, то одного потока хватит с головой. На худой конец, сконфигуряете на пул из 2х потоков https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html Запускается процесс, для ней сабмитится runnable в ScheduledExecutorService. При запуске runable проверяет, если его процесс ещё активет, то убивает его. Спасибо, это именно то, что нужно. Но я не могу понять один момент. Заказ я должна убивать в двух случаях: 1) по таймауту (прошло 5 минут никто не откликнулся), 2) когда статус заказа в базе данных поменялся с waiting на in_progress. С пунктом 1 все вроде понятно, а вот со 2 нет. Грубо говоря: Для первого пункта: Код: java 1. 2. 3. 4. 5. 6. А для второго как? Мне ведь нужно сопоставить как-то айдишник заказа с потоком, нужно это для того, чтобы пока крутится таймер лезть в базу, проверять статус и если он in_progress (т.е. его взяли на исполнение) - делать beeperHandle.cancel(true); Не совсем понимаю как этот момент разрулить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2014, 13:36 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulT, Жесть какая. В методе, который меняет статус, делаете проверку и вызываете отмену. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2014, 13:47 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
BlazkowiczJulT, Жесть какая. В методе, который меняет статус, делаете проверку и вызываете отмену. это понятно, я к тому, что не отвалятся ли при такой отмене другие таймеры связанные с другими заказами? ладно, нужно почитать детально про принцип работы ScheduledExecutorService, я впервые с ним сталкиваюсь спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2014, 13:53 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Жесть какая. В методе, который меняет статус, делаете проверку и вызываете отмену. На сколько я понял девушку, метод который меняет сатус работает в БД. Оттуда тяжело убить процесс. Хотя возможно это сам процесс нашедший исполнителя, тогда какие, спрашивается, сложности самому закончится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2014, 14:03 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев На сколько я понял девушку, метод который меняет сатус работает в БД. Этого мы знать не можем. Сергей Арсеньев Оттуда тяжело убить процесс. Не так уж и тяжело. Вешаем триггер. Кидаем событие. Ловим событие, отменям процесс по id. Сергей АрсеньевХотя возможно это сам процесс нашедший исполнителя, тогда какие, спрашивается, сложности самому закончится? Сложностей никаких нет. Странно, конечно, что вопрос начинается про таймеры, а продолжается в стиле "ну и как же мне тогда сделать что-то совершенно другое". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2014, 14:12 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Есть одна непонятная проблема: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Запускаю, каждую секунду в консоли выводится run task, все отлично. Но! Как только добавляю в метод run строчку: Код: java 1. (humanId=4) Код: java 1. 2. 3. 4. 5. 6. after никогда при этом не выводится, т.е. зависает на findOne. Делаю в другом классе вызов findOne, все работает. С чем это может быть связано? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 14:54 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulT, при некотором стечении обстоятельств твой сервер задач может рухнуть. Нужны какие-то limitations. Лучше всего - очередь задачь ожидающих своей диспетчеризации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 14:58 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
off очень интересно, как _ищется_ исполнитель 5 минут на гигагерцевом ядре процессора? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 16:22 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
если изменить термин на "заказ висит 5 минут в .....", то можно проходя обычным JOB раз минуту снимать статус протухшего заказа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 16:26 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulTafter никогда при этом не выводится, т.е. зависает на findOne. Та, нет же не зависает. Сколько можно рассказывать, что это кривизна в Excecutor, которые тихо кушают все исключения и даже на консоль их не выводят. А исключение вылетает, скорее всего, из-за того что в этом потоке репозиторий не работает, так как потом не связан с контейнером. Соответсвенно чего-то в своих ThreadLocal найти не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 16:31 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Petro123off очень интересно, как _ищется_ исполнитель 5 минут на гигагерцевом ядре процессора? ) Да при чём тут гигагерцы. Если там в БД хранимка чего-то долго ищет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 16:32 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
maytonPetro123off очень интересно, как _ищется_ исполнитель 5 минут на гигагерцевом ядре процессора? ) Да при чём тут гигагерцы. Если там в БД хранимка чего-то долго ищет. off расскажи алгоритм поиска ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 16:42 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
BlazkowiczJulTafter никогда при этом не выводится, т.е. зависает на findOne. Та, нет же не зависает. Сколько можно рассказывать, что это кривизна в Excecutor, которые тихо кушают все исключения и даже на консоль их не выводят. А исключение вылетает, скорее всего, из-за того что в этом потоке репозиторий не работает, так как потом не связан с контейнером. Соответсвенно чего-то в своих ThreadLocal найти не может. Вы абсолютно правы, вылетает exception, еле отловила его. Вся проблема в том, что не инжектится бин. Создала новую тему, а нужно было здесь продолжить. Повторюсь: Почему testRepository в классе: Код: java 1. 2. 3. 4. 5. всегда = null В этом же пакете рядом лежит другой класс: Код: java 1. 2. 3. 4. 5. и в нем инъекция проходит успешно. Если я правильно понимаю, то причина в implements Runnable. Помогите разобраться. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 18:00 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
причина в том, что спринг контейнер понятия не имеет о вашем потоке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 18:09 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
забыл ник, Да, спасибо, уже разобралась. Я вызываю контекст и явно вызываю getBean. Единственное, мне не нравится, что у меня дваждый вызывается конфигурация, первый раз при запуске приложения, второй раз при явном вызове метода через ctx.getBean .... Этого можно как-то избежать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 19:54 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulT, что значит вызывается? два раза инициализируется контекст? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 21:38 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
BlazkowiczJulTafter никогда при этом не выводится, т.е. зависает на findOne. Та, нет же не зависает. Сколько можно рассказывать, что это кривизна в Excecutor, которые тихо кушают все исключения и даже на консоль их не выводят. И как тогда бороться с этой проблемой? Как отлавливать исключения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 02:34 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
try{ } catch() { } finally ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 04:36 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
DDiverJulT, что значит вызывается? два раза инициализируется контекст? да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 08:24 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
не могу понять что происходит добавляю ctx в: Код: java 1. 2. 3. запускаю проект, в консоль валятся логи инициализации контекста, причем постоянно, в итоге все заканчивается исключением: to many connection. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 08:58 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulT, так не годится, контекст следует инициализировать только 1 раз. Например, при старте приложения. Или используя синглетон. Тут много разных способов, например такой: Код: java 1. 2. 3. 4. 5. 6. 7. 8. Дальше обращаемся к нему только через статический метод AppContextFactory.getInstance() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 09:15 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
ivanraJulT, так не годится, контекст следует инициализировать только 1 раз. Например, при старте приложения. Или используя синглетон. Тут много разных способов, например такой: Код: java 1. 2. 3. 4. 5. 6. 7. 8. Дальше обращаемся к нему только через статический метод AppContextFactory.getInstance() Спасибо огромное. Сделала так: в application-context.xml добавила строчку: Код: java 1. Далее: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Все отлично работает, но все же мой контекст вызывается дважды. Первый раз при старте приложения, второй раз при вызове getTestRepository(). Этого можно как-то избежать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 10:23 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=148&tid=2126134]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
315ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 692ms |

| 0 / 0 |
