2011-12-05 17 views
15

CDI kullanarak arka uç hizmetlerimizi uygulayarak denemeye başlıyoruz. Bu senaryo şudur: @ EAR dağıtıldığında @Startup ileCDI Uygulama ve Bağımlı kapsamlar çöp toplama etkisini etkileyebilir mi?

EJB başlatılır. Bir ApplicationScoped fasulye bu üzerine enjekte edilir:

@ApplicationScoped 
public class JobPlatform { 

    private PooledExecutor threadHolder; 

    @Inject @Any 
    private Instance<Worker> workerSource; 
... 

fasulye Ayrıca, bir etkinlik gözlenmiştir zaman, Örnek workerSource bir işçi fasulye alır ve sonunda çalışan ThreadPool'da, üzerine koyar, bir gözlemci yöntemi vardır tamamlamak.

Tüm güzel çalışıyor. Ancak ... çöp toplama konularını görmeye başladık. Bir JMAP yığın histogramı, bu işçilerin birçoğunun etrafında toplandıklarını, çöplerin toplandığını gösterir.

Bunun CDI kapsam belirleme ile ilişkili olduğuna inanıyoruz. @Dependant API sayfası (http://docs.jboss.org/cdi/api/1.0-SP1/javax/enterprise/context/Dependent.html) docs daha net ne pekiştiriyor:

  • @Dependent bir alana enjekte kapsamı ile bir fasulye bir örneği, fasulye yapıcı veya başlatıcı yöntemi bir bağımlı nesnedir içine enjekte edildiği fasulye veya Java EE bileşen sınıfı örneği.
  • Bir üretici yöntemine enjekte edilen Kapsam @ Kapsamlı bir çekirdeğin örneği, üretilmekte olan üretici yönteminin çekirdek nesnesinin bağımlı bir nesnesidir.
  • Bir Örneğin doğrudan çağrılmasıyla elde edilen kapsam @Dependent ile bir çekirdeğin örneği, Örnek örneğinin bağımlı bir nesnesidir.

Yani, şu bu:

workerSource fasulyesi JobPlatform bağlı ve bu nedenle,
  • Herhangi işçi fasulye buna bağlı olduğunu örneği kullanılarak alındığında bir ApplicationScoped ömrü vardır
    • ve Bu nedenle, ApplicationScoped kullanım ömrünün
    • olması gerekir. ApplicationScoped bağlamının fasulyesi (burada terminolojinin bilgisi biraz bulanıklaşır) işçi çekirdeklerine verilen feryat, yok edilen çöpler/toplanan çöpler yok

    CDI kullanan herkes buna katılıyor mu? Bu çöp toplama eksikliğini yaşadınız mı ve eğer varsa, herhangi bir geçici çözüm önerileriniz olabilir mi?

    İşçiler ApplicationScoped olamaz, ancak platform olması gerekir. Özel bir WorkerScope (uh ohhh ...) oluşturup her bir işçi sınıfına not ekleyeceksek, işçi ve örnek kaynağı arasındaki bağımlılığı ayırmak yeterli olur mu?

    Orada da ben bakacağız Is it possible to destroy a CDI scope? bazı önerilerde, ama kapsam geçerli bir neden gibi görünüyor olmadığını biraz takviye istedi.

    Yardım edeceğinizi umarız.

  • cevap

    9

    Anlayışınız doğru. Bu, spesifikasyondaki bir gözetim ve CDI 1.1'de düzeltilecek bir şeydi. Instance, SessionScoped veya ApplicationScoped gibi uzun süre çalışan bir kapsamda kullanıldığında anlattığınız gibi bir bellek sızıntısına sahip olabilir.Yapmanız gereken şey, örnek için Contextual veya Bean'u tutmanız ve bu şekilde yok etmektir.

    Yaptığınız şey için ve bellek sızıntısından sakınmak için BeanManager yöntemlerini kullanmak için en iyi yöntemdir (bu şekilde Bean üzerinde bir tanıtıcıya sahip olursunuz ve onu yok edebilirsiniz). Instance.

    +0

    Çok çabuk geri döndüğünüz için çok teşekkürler - tanındığını bilmek güzel konu. Şimdi geçici bir çözüm verecek! Şerefe! –

    +0

    Burada okuyan herkes için, Weld 1.1'in CDI 1.0 değil CDI 1.0'ı uyguladığı not edilmelidir. –

    +0

    Doğru Craig. Weld 2.0 CDI 1.1'i uygular (evet, numaralamanın garip olduğunu biliyorum). CDI 1.1'in nasıl olacağını görmek isterseniz, Weld 2.0'ı deneyin. Ben Weld 2.0 içeren JBoss AS7 özel yapıları olduğuna inanıyorum. – LightGuard