Salah satu hal pertama yang saya pelajari tentang pengembangan Java EE adalah bahwa saya tidak boleh menelurkan utas saya sendiri di dalam container Java EE. Tetapi ketika saya memikirkannya, saya tidak tahu alasannya.
Dapatkah Anda menjelaskan dengan jelas mengapa hal itu tidak disarankan?
Saya yakin sebagian besar aplikasi perusahaan memerlukan beberapa jenis pekerjaan asinkron seperti daemon email, sesi siaga, pekerjaan pembersihan, dll.
Jadi, jika memang seseorang tidak boleh menelurkan utas, apa cara yang benar untuk melakukannya saat diperlukan?
java
multithreading
jakarta-ee
LiorH
sumber
sumber
Jawaban:
Ini tidak disarankan karena semua sumber daya dalam lingkungan dimaksudkan untuk dikelola, dan berpotensi dipantau, oleh server. Selain itu, banyak konteks di mana utas digunakan biasanya dilampirkan ke utas eksekusi itu sendiri. Jika Anda hanya memulai utas Anda sendiri (yang saya yakin beberapa server bahkan tidak akan mengizinkannya), itu tidak dapat mengakses sumber daya lain. Artinya, Anda tidak bisa mendapatkan InitialContext dan melakukan pencarian JNDI untuk mengakses sumber daya sistem lain seperti JMS Connection Factories dan Datasources.
Ada cara untuk melakukan ini "dengan benar", tetapi itu tergantung pada platform yang digunakan.
WorkManager yang umum digunakan untuk WebSphere dan WebLogic serta yang lainnya
Info selengkapnya di sini
Dan di sini
Juga agak menduplikasi yang ini dari pagi ini
PEMBARUAN: Harap perhatikan bahwa pertanyaan dan jawaban ini terkait dengan kondisi Java EE pada tahun 2009, banyak hal telah meningkat sejak saat itu!
sumber
Untuk EJB, itu tidak hanya berkecil hati, itu secara tegas dilarang oleh spesifikasinya :
dan
Alasannya adalah bahwa EJB dimaksudkan untuk beroperasi dalam lingkungan terdistribusi. EJB mungkin dipindahkan dari satu mesin dalam cluster ke cluster lainnya. Benang (dan soket serta fasilitas terbatas lainnya) merupakan penghalang signifikan untuk portabilitas ini.
sumber
Alasan Anda tidak boleh menelurkan utas Anda sendiri adalah karena ini tidak akan dikelola oleh penampung. Kontainer menangani banyak hal yang sulit dibayangkan oleh pengembang pemula. Misalnya hal-hal seperti penggabungan thread, pengelompokan, pemulihan kerusakan dilakukan oleh penampung. Saat Anda memulai utas, Anda mungkin kehilangan beberapa di antaranya. Kontainer juga memungkinkan Anda memulai ulang aplikasi tanpa memengaruhi JVM tempat menjalankannya. Bagaimana ini mungkin terjadi jika ada utas di luar kendali wadah?
Ini alasan bahwa dari layanan timer J2EE 1.4 diperkenalkan. Lihat artikel ini untuk detailnya.
sumber
Utilitas Concurrency untuk Java EE
Sekarang ada cara standar dan benar untuk membuat utas dengan inti Java EE API:
Dengan menggunakan Concurrency Utils, Anda memastikan bahwa utas baru Anda dibuat, dan dikelola oleh penampung, menjamin bahwa semua layanan EE tersedia.
Contohnya disini
sumber
Anda selalu dapat memberi tahu container untuk memulai sesuatu sebagai bagian dari deskriptor penerapan Anda. Ini kemudian dapat melakukan tugas pemeliharaan apa pun yang perlu Anda lakukan.
Ikuti aturan. Anda akan senang suatu hari Anda melakukannya :)
sumber
Benang dilarang dalam wadah Java EE sesuai dengan cetak biru. Silakan lihat cetak biru untuk informasi lebih lanjut.
sumber
Tidak ada alasan nyata untuk tidak melakukannya. Saya menggunakan Quarz dengan Spring di aplikasi web tanpa masalah. Juga kerangka konkurensi
java.util.concurrent
dapat digunakan. Jika Anda menerapkan penanganan utas Anda sendiri, setel theads ke deamon atau gunakan grup utas deamon sendiri untuk mereka sehingga penampung dapat membongkar aplikasi web Anda kapan saja.Tapi hati-hati, sesi dan permintaan cakupan kacang tidak berfungsi di utas yang muncul! Juga kode lain yang didasarkan pada
ThreadLocal
tidak berfungsi di luar kotak, Anda perlu mentransfer nilai ke utas yang muncul sendiri.sumber
Saya tidak pernah membaca bahwa itu berkecil hati, kecuali dari kenyataan bahwa itu tidak mudah dilakukan dengan benar.
Ini adalah pemrograman tingkat rendah, dan seperti teknik tingkat rendah lainnya, Anda harus memiliki alasan yang bagus. Sebagian besar masalah konkurensi dapat diselesaikan jauh lebih efektif menggunakan konstruksi bawaan seperti kumpulan utas.
sumber
Salah satu alasan saya menemukan jika Anda menelurkan beberapa utas di Anda EJB dan kemudian Anda mencoba untuk membongkar kontainer atau memperbarui EJB Anda, Anda akan mengalami masalah. Hampir selalu ada cara lain untuk melakukan sesuatu di mana Anda tidak memerlukan Thread, jadi katakan saja TIDAK.
sumber