|
|
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulT, при старте приложения тоже надо вызывать метод AppContextFactory.getInstance(), это надо делать везде в приложении, где требуется получить контекст. На то он и синглетон ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 10:40 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
ivanraJulT, при старте приложения тоже надо вызывать метод AppContextFactory.getInstance(), это надо делать везде в приложении, где требуется получить контекст. На то он и синглетон как это сделать? у меня веб приложение, метода main нет. в web.xml прописано: Код: java 1. 2. 3. как вызвать AppContextFactory.getInstance() при старте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 10:58 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
ServletContextListener скорее всего здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 11:01 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulT, в таком случае класс AppContextFactory не нужен, контекст создается в ContextLoaderListener, поэтому можно попробовать извлечь контекст таким образом: Код: java 1. Вообще, при всех его преимуществах спринга, иногда легко потеряться в этих конфигах. Хорошо исходники под рукой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 11:35 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Имплементируйте интерфейс http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/ApplicationContextAware.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 11:43 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
JulT, Может стоит мануал почитать прежде чем кактус вот так вот кушать без хлеба? В Spring куча готовых оберток и реализация для ExecutorService http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html Которые как раз и решают проблему использования контекста в новых потоках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 11:47 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
Petro123maytonпропущено... Да при чём тут гигагерцы. Если там в БД хранимка чего-то долго ищет. off расскажи алгоритм поиска Я не понял сути вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 12:32 |
|
||
|
Задача с таймерами
|
|||
|---|---|---|---|
|
#18+
maytonЯ не понял сути вопроса. OK, "расписали". Раз автор не отвлекается на офф) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 13:09 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2126134]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
99ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 519ms |

| 0 / 0 |
