Redeploy bo'ylab JEE6 taymerining chidamliligi

Rivojlanayotgan ilovaning vazifalaridan biri tizimda ishlaydigan boshqa ilovalarning ma'lumotlarini zaxiralashdir. Ushbu zaxira jarayonini rejalashtirmoqchi bo'laman, chunki u qarovsiz ishlaydi. JEE6/EJB3.1 Timer dasturidan foydalanayapman.

Men TimerHandle turidagi ob'ektga ega bo'lgan JPA2 dan foydalangan holda ma'lumotlar bazasiga saqlanadigan BackupConfiguration sinfim bor. Agar foydalanuvchi zaxirani rejalashtirishga qaror qilsa, men doim yangi taymerni yarataman va TimerHandle maydonini to'ldiraman.

Serverni qaytadan boshlaganimda hamma narsa yaxshi, taymerlar qayta ishga tushiriladi (va barcha taymerlar bir zumda olov yoqib, xavotirga o'xshaydi).

Agar ilovani qayta tarqatsam (u ishlab chiqayotganimda juda ko'p bo'ladi) barcha taymerlar yo'qoladi! Men ahmoqlik bilan timer serverga bog'langan deb o'ylayman, lekin ular dasturga bog'liq ekanligi ayon bo'ladi.

Shunday qilib, mening savolim, qayta joylashtirishda qat'iy bo'lgan taymerlarni yaratishning eng yaxshi yo'li nima?

Ko'rib turgan bitta yechim ScheduleExpression va TimerHandle-ni zahira konfiguratsiyasi bilan saqlash kerak. So'ngra menda taymer bo'lsa, taymer bo'lmasa taymerni qayta yarataman. Buning asosiy sababi, dastur har safar rejalashtirilayotgan ob'ektni sanab o'tishni hisoblashni anglatadi. Bu hozirgi paytda juda ko'p ish emas, balki kelajakda katta xarajat bo'lishi mumkin.

2
Men GlassFish 3.0.1 dan foydalanmoqdaman, bu standart xatti-harakat kabi ko'rinadi.
qo'shib qo'ydi muallif wobblycogs, manba
Qaysi dastur serveridan foydalanmoqdasiz? Siz WebSphere Application Server xatti-harakatlarini tavsiflayapsiz, lekin aniq emas. Siz foydalanadigan dastur serveri bo'lsa, unda olib tashlashni amalga oshirganingizda (masalan, ajratilgan wsadmin seansidan foydalangan holda) ilova serveri to'xtatilmas ekan qayta joylashtirish vaqtida doimiy taymerlarni tozalashning imkoniyati mavjudligiga ishonmayman.
qo'shib qo'ydi muallif Brett Kail, manba

2 javoblar

For GlassFish there is --keepstate=true option of the asadmin redeploy command.
It retains EJB timers between redeployments.
For details you can see:
http://docs.oracle.com/cd/E18930_01/html/821-2418/beahw.html
http://docs.oracle.com/cd/E18930_01/html/821-2416/ggndx.html#SJSASEEAGgkudf
http://docs.oracle.com/cd/E18930_01/html/821-2433/redeploy-1.html#scrolltoc

2
qo'shib qo'ydi

Ko'pchilik (ehtimol, barchasi) dastur serverlari dasturni serverga emas, balki ilovalarga doimiy ravishda taymer sifatida kiritishi mumkin. Buning ma'nosi mantiqan to'g'ri keladi, chunki siz taymerlar atrofida osib qo'yishni xohlamasligingiz kerak bo'lgan ilovani olib tashlanganda. Rivojlanish jarayonida noqulaylik tug'diradi, chunki NetBeans, hech bo'lmaganda, qayta o'rnatilishdan oldin dasturni olib tashlaydi, shuning uchun barcha taymerlarni yo'qotadi.

Men erishgan yechim TimerHandle va ma'lumotlar bazasida rejalashtirish ma'lumotlarini saqlashdir. Ilova ishga tushirilganda TimerRepair singleton fasulyesi yaratiladi, uni ta'mirlash uchun Tarmerlarni talab qiladigan har qanday sinflarga chaqiradi. RepairTimers usuli barcha jadvallarni tanlaydi va TimerHandle Timerni qayta tiklashga harakat qilsa. Taymerni qayta tiklash istisno qilsa, rejalashtirish ma'lumotidan Taymerni qayta tiklaydi. Umuman olganda, bu yechim sifatida juda yomon emas, men bilan faqat haqiqiy tashvishlar juda ko'p narsalar rejalashtirilgan bo'lsa, ortiqcha boshlash vaqti.

1
qo'shib qo'ydi