|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Всем привет! Задача такая: веб-приложение при старте должно запускать несколько процессов (заранее неизвестно сколько), которые должны шуршать в фоне. Делаю на грубом примере так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
Все работает. Но потом делаем undeploy приложения, а файл все равно пишется. Похоже, что при андеплое приложения не приходим в contextDestroyed. Остановить можно только андеплой плюс рестарт веб-сервера. Возникает вопрос как сделать, чтобы "дочерний" поток прерывался при дисейбле/андеплое приложения на сервере. Переписываем в зародыш маленького ада: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
И каким-то чудом теперь все работает как требуется. Но хотелось бы понять, в чем фишка? Почему работает в данном случае как надо, только если лисенер сам себя засовывает в поток? (как понял, только в этом случае приходим в contextDestroyed). И возможно, как реализовать правильнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 19:27 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
"Веб-приложение" работает в сервлет-контейнер. Жизненный цикл сервлета предусматривает методы init() и destroy(). Метод destroy() должен выставить флаг "кончай работу" и любым способом контролировать число оставшихся в работе потоков Ваш(и) метод(ы) обязан(ы) регулярно проверять этот флаг, чтобы иметь возможность корректно завершаться без ударов киянкой по голове. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 19:50 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, это понятно. Но даже если вместо interrupt использовать флаг, который при выставлении в contextDestroyed выходит из цикла в методе run, поведение получается точно такое же (поток не останавливается при undeploy/disable). Понятно, что по флагу правильнее "мягче", но вопрос в том почему второй вариант работает и мы приходим в contextDestroyed, а первый нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 21:11 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSкаким-то чудом теперь все работает как требуется.про чудо потом. Ты скажи что он пишет в файл, если старший ушел с сервера? Может это и правильно, не вырубать его? Посреди работы? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 21:21 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, пишет ровно то, что в коде "Ку!". Вырубать его однозначно надо. По флагу или нет, вопрос не в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 22:00 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSИ каким-то чудом теперь все работает как требуется. Но хотелось бы понять, в чем фишка? Почему работает в данном случае как надо, только если лисенер сам себя засовывает в поток? (как понял, только в этом случае приходим в contextDestroyed). И возможно, как реализовать правильнее? дружище ты никогда не станешь программистом нормальным если будешь задавать такие вопросы другими словами ты забиваешь свою голову тем,что тебе не нужно ) сделал - работает - расслабь булки и получай удовольствие ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 22:32 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSВырубать его однозначно надов оракле вырубается набором kill. Поэтому хороший поток кончить должен" (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2019, 23:01 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
asv79, главное не купить билет на самолет, автопилот к которому сам же написал по такому принципу PetroNotC Sharp, про оракле не понял) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 07:57 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDS, В оракле и линуксе я кончаю поток набором kill в командной строке. Почему у тебя поток работает без бензина ты не рассказал. Может его изменить так чтобы он работал только под конкретную задачу, 1-10 сек. Приложение выгрузил (а не выдернул из розетки) и поток доделал свою задачу. Это вопрос чисто по постановке. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 08:12 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, в том и дело, что без бензина не надо работать (если это про ведущий поток). Да, можно завершить нормально без прерывания, но вопрос другой. Насчет кил операционкой "это же не наш метод" (с) ) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 08:57 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSчто без бензина не надо работать (если это про ведущий поток).у тебя не ведущий и не основной. На основном томкат сидит. Доп.поток создал ты сам. Почему он не заканчивает а крутится на бесконечном цикле? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 09:42 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDS, Пример. Сброс кэша в лог файл. Приложение закрыл, а в файл записывается и дескриптор закрывается. Почему у тебя не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 09:45 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, это понятно что сам. Например, он должен периодически проверять директорию на предмет появления там файлов, например, он должен держать коннект с другой прогой и тд. В общем этот поток должен работать пока работает основной (про основной томкат не будем, итак все время всторону уходим)). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 10:44 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDS Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
И возможно, как реализовать правильнее? У вас бесконечный цикл, который не заканчивается - добавил комментарий в то место, где ошибка. Правильнее было бы написать не while (true) а while (workingFlag) А в вызове contextDestroyed выставлять workingFlag = false и дожидаться через другой флаг того, что поток действительно завершился. Пишу упрощенно - "через флаг", но в действительности есть много классов для многопоточной работы и правильнее было бы через них, но это уже надо делать "во второй серии". Не забудьте на ваши "флаги" добавить ключевое слово volatile (ну или обрамить доступ к ним методами с synchronized) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:24 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Натянуты твои задачи. Если они фоновые, то и делай отдельное приложение демон и старт, стоп. Если нет, то нефиг молотить операционку на предмет - есть ли изменения при простом деплое. ЛЮБОЙ СТАРТ ПРОГЕРА ДОЛЖЕН ИМЕТЬ СТОП В API. Да и приложение может быть развернуто вообще в докере где нет файловой системы и d: и с: JDS Код: java 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:33 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
qastaУ вас бесконечный циклда. Но он сопротивляется. В его API не предусмотрено СТОП)) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:34 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, ну елы-палы, ребят, я ж уже 4 раза сказал, что это просто пример и вопрос в другом Про флаг это понятно. Почему в первом случае не приходим в обработчик ondestroy, а во втором приходим) Ну не задавал же я вопрос про флаг и натянутость задачи). Да. Спросил, как сделать лучше, но в рамках примера (те поток шуршит все время пока жив породивший поток). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:39 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
qastaА в вызове contextDestroyedу него не вызывается. В этом вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:39 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC SharpqastaА в вызове contextDestroyedу него не вызывается. В этом вопрос. Вызывается, но только во втором варианте. Вопрос в том почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:40 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSPetroNotC Sharpпропущено... у него не вызывается. В этом вопрос. Вызывается, но только во втором варианте. Вопрос в том почему.убери для вопроса все лишнее вместе с классом. Вызывается? И ссылку сюда на доки. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 11:44 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
Наворотил кода по памяти, а пртом спрашивает почему не работает. А обычно пишут - написал, протестил. Написал, протестил. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:01 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, два простых примера, отражающие суть вопроса и не по памяти, а вполне протестированы. Если бы наворотил, то притащил бы сюда весь код) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:10 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSPetroNotC Sharpпропущено... у него не вызывается. В этом вопрос. Вызывается, но только во втором варианте. Вопрос в том почему. В вашем верхнем примере цикл никогда не закончится - ему наплевать на какие-то там флажки и прочее. Почему - я написал. Именно для того, чтобы поток нельзя было прервать где и когда захочется (эквивалент kill -9) и убрали метод Thead.stop(). Для прерывания в "заранее оговоренных местах" используются "флаги". Я вам написал, что надо сделать. Вы сделайте и протестируйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:29 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
JDSотражающие суть вопросасуть ПРОГРАММИРОВАНИЯ в ПОСЛЕДОВАТЕЛЬНЫХ шагах. У вас из первого кода не следует второй кусок. Нужно первый кусок - рабочий и второй с ошибкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 12:31 |
|
Корректное закрытие потоков.
|
|||
---|---|---|---|
#18+
qasta, вот хотел же написать пример с флагом, тк понимал, что возможно народ пойдет в эту сторону, но понадеялся, что обьясню, а зря :) Я же говорю, что и с флагом поведение ровно такое же, вопрос не в этом. PetroNotC Sharp, второй вариант, который работает как надо был получен методом тыка, поэтому конечно второй кусок не следует из первого. Различие в первом и втором примере очевидно, ну внутренняя суть не ясна: почему в 1 варианте не приходим в блок "финализации" сервлета. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2019, 13:12 |
|
|
start [/forum/topic.php?fid=59&fpage=25&tid=2121185]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 413ms |
0 / 0 |