Java EE kapsayıcısında iş parçacığı oluşturmak neden önerilmiyor?


120

Java EE geliştirme hakkında öğrendiğim ilk şeylerden biri, kendi iş parçacıklarımı bir Java EE kapsayıcısında oluşturmamam gerektiğidir. Ama düşünmeye başladığımda sebebini bilmiyorum.

Neden cesaretinin kırıldığını açıkça açıklayabilir misiniz?

Çoğu kurumsal uygulamanın posta arka plan programı, boşta kalma oturumları, temizleme işleri vb. Gibi bir tür eşzamansız işlere ihtiyaç duyduğundan eminim.

Öyleyse, gerçekten de bir kişi iplik üretmemeli, gerektiğinde bunu yapmanın doğru yolu nedir?


4
Eşzamansız görevler genellikle JMS mesajlaşma ve MDB'ler kullanılarak yapılır.
Ken Liu

5
JSR 236 kapsayıcılara uygulandıktan sonra bu sorun yakında geçmişte kalacaktır .
letmaik

5
Bu edilmiş herhangi bir ikinci ipler oluşturulan ve kap tarafından yönetilmesi gerektiğini, çünkü iplik diğer kurumsal kaynaklara erişebilir böylece, cesaretini. Java EE7 ile, kurumsal bir ortamda iş parçacığı oluşturmanın standart ve doğru bir yolu vardır. Concurrency Utils'i kullanarak, yeni iş parçacığınızın konteyner tarafından oluşturulmasını ve yönetilmesini sağlayarak tüm EE hizmetlerinin kullanılabilir olmasını garanti edersiniz. Örnek burada
Chris Ritchie

JSF / EJB perspektifinde birkaç doğru yol burada bulunabilir: stackoverflow.com/q/6149919
BalusC

Yanıtlar:


84

Ortamdaki tüm kaynakların sunucu tarafından yönetilmesi ve potansiyel olarak izlenmesi gerektiği için önerilmez. Ayrıca, bir iş parçacığının kullanıldığı bağlamın çoğu, genellikle yürütme iş parçacığının kendisine eklenir. Sadece kendi iş parçacığınızı başlatırsanız (bazı sunucuların izin vermeyeceğine inanıyorum), diğer kaynaklara erişemez. Bunun anlamı, bir InitialContext alamayacağınız ve JMS Bağlantı Fabrikaları ve Veri Kaynakları gibi diğer sistem kaynaklarına erişmek için JNDI aramaları yapamayacağınızdır.

Bunu "doğru" yapmanın yolları vardır, ancak kullanılan platforma bağlıdır.

Commonj WorkManager, WebSphere ve WebLogic ve diğerleri için ortaktır

Daha fazla bilgi burada

Ve burada

Ayrıca bu sabahki bir şekilde bunu kopyalıyor

GÜNCELLEME: Lütfen bu soru ve cevabın 2009'daki Java EE durumuyla ilgili olduğunu unutmayın, o zamandan beri işler düzeldi!


1
JMS Bağlantı Fabrikaları ve Veri Kaynakları gibi diğer sistem kaynaklarına erişmek için bir InitialContext alamazsınız ve JNDI aramaları yapamazsınız. İş parçacıkları başlatılırken veri kaynağını enjekte ederek bunun etrafında çalışan bir uygulamam var, ancak bu yaklaşımı yeniden düşünmem gerekebilir ...
rjohnston

6
Artık çekirdek Java EE API ile iş parçacığı oluşturmanın standart ve doğru bir yolu var. Concurrency Utils'i kullanarak, yeni iş parçacığınızın konteyner tarafından oluşturulmasını ve yönetilmesini sağlayarak tüm EE hizmetlerinin kullanılabilir olmasını garanti edersiniz. Burada ve burada
Chris Ritchie

@ChrisRitchie bahşiş için teşekkürler. yalnızca JBoss AS / IBM, Java EE 7'yi desteklediyse ... :-(
asgs

1
@asgs WildFly 8 (JBoss AS'nin yeni adı) Java EE 7'yi destekliyor. IBM yalnızca Java EE 6 sertifikalı sertifikadır
Chris Ritchie

34

EJB'ler için, sadece cesareti kırılmakla kalmaz, aynı zamanda şartname ile açıkça yasaklanmıştır :

Kuruluş fasulyesi, birden çok örneğin yürütülmesini senkronize etmek için iş parçacığı senkronizasyon ilkellerini kullanmamalıdır.

ve

Kurumsal fasulye, iş parçacıklarını yönetmeye çalışmamalıdır. Enterprise Bean, bir iş parçacığını başlatmaya, durdurmaya, askıya almaya veya devam ettirmeye ya da bir iş parçacığının önceliğini veya adını değiştirmeye çalışmamalıdır. Kurumsal fasulye, iş parçacığı gruplarını yönetmeye çalışmamalıdır.

Bunun nedeni, EJB'lerin dağıtılmış bir ortamda çalışmasıdır. EJB, bir kümedeki bir makineden diğerine taşınabilir. İplikler (ve soketler ve diğer kısıtlı tesisler) bu taşınabilirlik için önemli bir engeldir.


3
Java EE7 Eş Zamanlılık Araçları, bir kuruluş ortamında iş parçacığı oluşturmak için doğru bir yol sağlar. Burada ve burada
Chris Ritchie

1
@Dan Bir iş parçacığının bir EJB'yi bir makineden diğerine taşımanın taşınabilirliğine neden önemli bir engel oluşturduğunu bana açıklayabilir misiniz?
Geek

13

Kendi iş parçacıklarınızı oluşturmamanızın nedeni, bunların konteyner tarafından yönetilmemesidir. Konteyner, acemi bir geliştiricinin hayal etmesi zor bulabileceği pek çok şeyi halleder. Örneğin, iş parçacığı havuzu oluşturma, kümeleme, kilitlenme kurtarma gibi şeyler konteyner tarafından gerçekleştirilir. Bir iş parçacığı başlattığınızda bunlardan bazılarını kaybedebilirsiniz. Ayrıca konteyner, üzerinde çalıştığı JVM'yi etkilemeden uygulamanızı yeniden başlatmanıza izin verir. Konteynırın kontrolü dışında iplikler varsa bu nasıl mümkün olabilir?

J2EE 1.4'ten zamanlayıcı hizmetlerinin tanıtılmasının nedeni budur. Ayrıntılar için bu makaleye bakın.


2
JSR 236, Java EE 7 ve sonraki sürümlerde yayılmayı desteklemek için özellikler ekledi. Chris Ritchie'nin yazdığı kardeş cevabına bakın .
Basil Bourque


2

Her zaman kapsayıcıya dağıtım tanımlayıcılarınızın bir parçası olarak işleri başlatmasını söyleyebilirsiniz. Bunlar daha sonra yapmanız gereken bakım görevlerini yerine getirebilir.

Kurallara uymak. Yaptığın bir gün çok sevineceksin :)


2

Taslaklara göre Java EE kapsayıcılarında iş parçacığı yasaklanmıştır. Daha fazla bilgi için lütfen planlara bakın .


2

Bunu yapmamak için gerçek bir sebep yok. Ben kullanılan QUARZ ile Bahar sorunsuz bir webapp. Aynı zamanda eşzamanlılık çerçevesi java.util.concurrentde kullanılabilir. Kendi iş parçacığı işlemenizi uygularsanız, düğümleri deamon olarak ayarlayın kapsayıcı, Webapp her zaman boşaltmak böylece ya da onlar için bir kendi deamon iplik grubu kullanın.

Ancak dikkatli olun, fasulye kapsamları oturumu ve isteği ortaya çıkan iş parçacıklarında çalışmaz! Ayrıca üzerine temellenen diğer kodlar kutudan ThreadLocalçıkmaz, değerleri kendi başınıza ortaya çıkan konulara aktarmanız gerekir.


1

Doğru şekilde yapmanın kolay olmadığı gerçeği dışında, cesaretinin kırıldığını asla okumadım.

Oldukça düşük seviyeli bir programlamadır ve diğer düşük seviyeli teknikler gibi iyi bir nedene sahip olmanız gerekir. Çoğu eşzamanlılık sorunu, iş parçacığı havuzları gibi yerleşik yapılar kullanılarak çok daha etkili bir şekilde çözülebilir.


7
şartnameye göre gerçekten yasaktır.
Ken Liu

1

EJB'nizde bazı iş parçacıkları ortaya çıkarırsanız ve sonra kabı kaldırmaya çalışırsanız veya EJB'nizi güncellerseniz, sorunlarla karşılaşacağınızı bulmamın bir nedeni. Bir Konuya ihtiyaç duymadığınız bir şeyi yapmanın neredeyse her zaman başka bir yolu vardır, bu yüzden sadece HAYIR deyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.