Някаква кука за изключване, когато приложението е принудително затворено?

Има ли някакъв начин да накарате програмата да премине през куката за изключване, ако потребителят принуди Java да затвори (чрез диспечера на задачите или чрез затваряне на съответния партиден файл).

Програмата ми в момента работи и се изпълнява добре, ако потребителят затвори GUI, тогава тя преминава през набор от стъпки за прекъсване на връзката с базата данни. Въпреки това, ако потребителят затвори Java или партидния файл (работещ рамо до рамо с GUI), връзката с базата данни не се затваря.

Възможно ли е по някакъв начин да затворите принудително връзката и може би дори да изтриете нещо от таблиците? Вероятно пакетният файл няма да е проблем, когато архивирам програмата, но спирането на процеса все още ще бъде.


person Cody    schedule 02.11.2011    source източник


Отговори (1)


не

Куката за изключване ще реагира на Ctrl+C, нормално затваряне, излизане на потребителя и нормално изключване на системата (което изисква грациозно изключване на всички приложения).

Въпреки това, ако някой принудително затваря приложението, се предполага, че това е, което всъщност искате - незабавно прекратяване без допълнително известие. Този въпрос е задаван много пъти и е объркан от поведението на много приложения, които, когато бъдат помолени да затворят принудително, всъщност им отнема много време, за да прекратят окончателно. Това е така, защото в усилията на операционната система да освободи всички ресурси, някои ресурси (особено определени I/O и/или файлови ресурси) не се освобождават веднага.

При тестване приложение, което се стартира и е предназначено да работи до правилно изключване (напр. сървърен софтуер), трябва да го стартирате от конзолата/командния ред и да натиснете Ctrl+C, за да спрете програмата (което ще стартира куката за изключване), вместо да използва Task Manager или KILL -9.

Освен това няма нищо, което Java би могла да направи дори по въпроса, ако искаше. Принудителното затваряне се случва на ниво операционна система, в който момент се освобождава използваната памет, файл и I/O манипулатори и т.н. Java няма (нито която и да е друга програма) контрол върху принудителното затваряне. В този момент операционната система поема отговорността.

person jefflunt    schedule 02.11.2011
comment
Да, разбирам това, но има ли някакъв друг метод за гарантиране на това, чрез друга програма или нещо, което работи рамо до рамо. Подобно на вирусите например, ако се затворят принудително, те просто се отварят отново. Очевидно не правя вирус, а просто затваряне на база данни преди изход. - person Cody; 02.11.2011
comment
+1 за посочване, че прекратяването се случва на ниво операционна система. - person Tim Bender; 02.11.2011
comment
@Cody, сървърът на вашата база данни трябва да затвори връзката след изчакване. Що се отнася до всякакви временни или работещи данни в базата данни, опитайте да използвате транзакции. Процесът на монитора е просто заешка дупка. - person Tim Bender; 02.11.2011
comment
Вероятно бихте могли да хакнете нещо заедно (като например да наблюдавате списъка с изпълнявани процеси и да използвате прекъсването за задействане на реакция), но това, което се опитвам да отбележа е, че по дизайн е принудително затваряне е задънена улица. Да се ​​опитвате да заобиколите или да реагирате на силно приближаване НЕ е това, което искате да правите. Това е сила близо. Подобно на смъртта, това е част от живота и опитите да се борите с него само ще ви отведат по пътеки, които се опитват да се борят срещу начина, по който трябва да работи жизненият цикъл на операционната система/приложението. Повечето въпроси, които задават това, не разбират напълно тази реалност. - person jefflunt; 02.11.2011
comment
Единственото изключение от този вид поведение, за което се сещам (може да има и други), са системите за наблюдение на софтуер/инфраструктура, предназначени да следят за принудително затваряне/сривове и да изпълняват някаква автоматизирана задача в резултат на това (напр. рестартиране на услуги, изпращане на известие до администратор и др.). - person jefflunt; 02.11.2011
comment
добре донякъде това е идеята, но ако даден потребител влезе в сесията си чрез програмата и не бъде премахнат от списъка с влезли потребители, той няма да може да влезе отново, докато името му не бъде премахнато ръчно . (Така работи моята програма) - person Cody; 02.11.2011
comment
Хм, поддържах приложение за банкиране, което имаше нещо като подобна функционалност. Идеята в този случай беше да се попречи на един и същ потребителски акаунт да може да бъде влязъл от множество станции (в този случай станции Teller). В случая с това приложение, тъй като се смяташе за мярка за сигурност, потребителите просто трябваше да се справят с това да запомнят да излязат сами или трябваше да се обадят на администратор, за да ги принудят да излязат. Т.Е. банката постави тежестта да направи правилното нещо върху потребителя. - person jefflunt; 02.11.2011