Redeploy boyunca JEE6 Zamanlayıcı Kalıcılık

Geliştirdiğim uygulamanın görevlerinden biri, sistemde çalışan diğer uygulamaların verilerini yedeklemek. Bu yedekleme işlemini, katılımsız olarak çalışabilmesi için zamanlamak istiyorum. JEE6/EJB3.1 Timer yardımcı programlarını kullanıyorum.

TimerHandle türü olan JPA2'yi kullanarak veritabanına devam ettiğim bir sınıf BackupConfiguration'um var. Kullanıcı yedeklemeyi zamanlamaya karar verirse, yeni bir kalıcı Zamanlayıcı oluşturup TimerHandle alanını doldururum.

Sunucuyu yeniden başlatırsam her şey yolunda giderse, zamanlayıcılar yeniden başlatılır (ve tüm zamanlayıcılar aynı anda ateşlendiğinde kısa bir panik vardır) ve her şey ben onu bıraktığım gibi.

Uygulamayı yeniden geliştirirsem (geliştirirken oldukça fazla olan) tüm zamanlayıcılar kaybolur! Aptalca zamanlayıcıların sunucuya bağlanacağını, ancak uygulamaya bağlı olduklarını düşündüm.

Öyleyse, sorum, yeniden dağıtımda kalıcı olan zamanlayıcılar yapmanın en iyi yolu nedir?

Görebildiğim tek çözüm, ScheduleExpression'un yanı sıra TimerHandle'ı yedekleme yapılandırmasıyla saklamaktı. Daha sonra, eğer bir tutamacım varsa ama Zamanlayıcı yoksa, zamanlayıcıyı yeniden oluştururuz. Bununla birlikte, asıl sorun, programın, eksik zamanlayıcılar varsa, uygulamayı bulmaya başladığı her zaman, her programlanmış varlığı sıralamak anlamına gelmesidir. Bu şu anda çok fazla iş değil, gelecekte büyük bir maliyete dönüşebilir.

2
GlassFish 3.0.1 kullanıyorum, bu standart davranış gibi görünüyor.
katma yazar wobblycogs, kaynak
Hangi uygulama sunucusunu kullanıyorsunuz? WebSphere Application Server uygulamasının davranışını açıklıyorsunuz, ancak açık değil. o kullandığınız uygulama sunucusu varsa, o zaman senin uygulama sunucusu kaldırma gerçekleştirdiğinizde durmadıkça redeploy sırasında kalıcı zamanlayıcılar temizleyerek önlemek için bir seçenek olduğuna inanmıyorum (örneğin bir bağlantısı kesilmiş wsadmin oturumu kullanarak).
katma yazar Brett Kail, kaynak

2 cevap

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
katma

Çoğu (muhtemelen tüm) uygulama sunucularının, zamanlayıcıları sunucuya değil, uygulamaya kalıcı hale getirdiği görülecektir. Bu, bir uygulamayı kaldırdığınızda zamanlayıcıların etrafta takılmasını istemeyeceğiniz anlamına gelir. Geliştirme sırasında bu durum gariptir, çünkü NetBeans, en azından yeniden dağıtmadan önce uygulamayı kaldıracak ve tüm zamanlayıcıları kaybedecektir.

Geldiğim çözüm, TimerHandle ve zamanlama bilgilerini veritabanında saklamak. Uygulama başladığında, bunu gerektiren herhangi bir sınıfta repairTimers öğesini çağıran bir TimerRepair singleton bean oluşturur. RepairTimers yöntemi tüm Programları seçer ve eğer bir TimerHandle'ı varsa, Timer'ı kurtarmaya çalışırlar. Zamanlayıcı kurtarma bir istisna atarsa, Zamanlayıcıyı programlama bilgisinden yeniden oluşturur. Genel olarak bir çözüm olarak çok kötü değil, bir çok öğe planlanmışsa benim tek gerçek endişem, aşırı başlangıç ​​zamanı.

1
katma