Apa itu EJB, dan apa fungsinya?

151

EJBSudah mencoba mempelajari apa itu kacang, apa artinya contoh mereka dikelola di kolam, bla bla. Benar-benar tidak bisa menguasai mereka.

Bisakah Anda menjelaskan kepada saya apa itu sebenarnya (praktis untuk Programmer Java)? Apa yang mereka lakukan? Apa tujuan mereka? Mengapa benar-benar menggunakannya? (Kenapa tidak tetap berpegang pada POJO?) Mungkin contoh aplikasi?

Silakan merujuk hanya ke informasi yang diperbarui, yaitu EJB 3.1. Informasi tertanggal tentang EJB dapat menyesatkan.

Untuk pemula yang belajar EJB, harap diperhatikan:

EJB didasarkan pada objek terdistribusi , ini merujuk pada potongan perangkat lunak yang berjalan pada beberapa mesin (virtual atau fisik) yang ditautkan oleh jaringan .

jacktrades
sumber

Jawaban:

161

Mengapa benar-benar menggunakannya? (Kenapa tidak tetap berpegang pada POJO?)

JIKA Anda membutuhkan komponen yang mengakses database, atau mengakses konektivitas lain / sumber daya direktori, atau diakses dari banyak klien, atau dimaksudkan sebagai layanan SOA, EJBs saat ini biasanya "lebih besar, lebih kuat, lebih cepat (atau setidaknya lebih skalabel) dan lebih sederhana "daripada POJO. Mereka paling berharga untuk melayani sejumlah besar pengguna melalui web atau jaringan perusahaan dan agak kurang bernilai untuk aplikasi kecil dalam suatu departemen.

  1. Menggunakan kembali / Berbagi Logika di beberapa aplikasi / klien dengan Kopling Lepas.
    EJB dapat dikemas dalam toples mereka sendiri, digunakan, dan dipanggil dari banyak tempat. Mereka adalah komponen umum. Benar, POJO dapat (hati-hati!) Dirancang sebagai perpustakaan dan dikemas sebagai botol. Tetapi EJB mendukung akses jaringan lokal dan jarak jauh - termasuk melalui antarmuka java lokal, RMI transparan, pesan async JMS dan layanan web SOAP / REST, menghemat dari dependensi cut-and-paste jar dengan beberapa penyebaran (tidak konsisten?).
    Mereka sangat berguna untuk membuat layanan SOA. Ketika digunakan untuk akses lokal mereka adalah POJO (dengan layanan kontainer gratis ditambahkan). Tindakan merancang lapisan EJB terpisah mempromosikan perawatan ekstra untuk memaksimalkan enkapsulasi, penggabungan longgar dan kohesi, dan mempromosikan antarmuka yang bersih (Fasad), melindungi penelepon dari pemrosesan yang rumit & model data.

  2. Skalabilitas dan Keandalan Jika Anda menerapkan sejumlah besar permintaan dari berbagai pesan / proses / utas panggilan, permintaan tersebut didistribusikan di seluruh mesin virtual EJB yang tersedia di kumpulan terlebih dahulu dan kemudian diantrekan. Ini berarti bahwa jika jumlah permintaan masuk per detik lebih besar dari yang dapat ditangani oleh server, kami menurunkan dengan anggun - selalu ada beberapa permintaan yang diproses secara efisien dan permintaan berlebih dibuat untuk menunggu. Kami tidak mencapai server "kehancuran" - di mana SEMUA permintaan mengalami waktu respons yang buruk secara bersamaan, ditambah server mencoba mengakses lebih banyak sumber daya daripada yang dapat ditangani oleh perangkat keras & OS & karenanya macet. EJB dapat digunakan pada tier terpisah yang dapat dikelompokkan - ini memberikan keandalan melalui failover dari satu server ke yang lain, ditambah perangkat keras dapat ditambahkan ke skala secara linear.

  3. Manajemen Concurrency. Wadah memastikan bahwa mesin virtual EJB diakses secara aman (seri) oleh banyak klien. Kontainer mengelola kumpulan EJB, kumpulan thread, antrian doa, dan secara otomatis melakukan penguncian tulis tingkat metode (default) atau penguncian membaca (melalui @Lock (READ)). Ini melindungi data dari korupsi melalui bentrokan tulis-tulis bersamaan, dan membantu data dibaca secara konsisten dengan mencegah bentrokan baca-tulis.
    Ini terutama berguna untuk kacang sesi @Singleton, di mana kacang memanipulasi dan berbagi keadaan umum di seluruh penelepon klien. Ini dapat dengan mudah dikuasai untuk secara manual mengkonfigurasi atau secara terprogram mengendalikan skenario lanjutan untuk eksekusi kode bersamaan dan akses data.

  4. Penanganan transaksi otomatis.
    Jangan lakukan apa-apa dan semua metode EJB Anda dijalankan dalam transaksi JTA. Jika Anda mengakses database menggunakan JPA atau JDBC itu secara otomatis terdaftar dalam transaksi. Sama untuk pemanggilan JMS dan JCA. Tentukan @TransactionAttribute (someTransactionMode) sebelum metode untuk menentukan jika / bagaimana metode tertentu mengambil bagian dalam transaksi JTA, menimpa mode default: "Diperlukan".

  5. Akses sumber daya / ketergantungan yang sangat sederhana melalui injeksi.
    Kontainer akan mencari sumber daya dan menetapkan referensi sumber sebagai bidang contoh di EJB: seperti koneksi JDBC yang disimpan JNDI, koneksi / topik / antrian JMS, EJB lainnya, Transaksi JTA, konteks kegigihan manajer entitas JPA, unit kegigihan entitas manajer pabrik JPA, unit persistensi pabrik entitas JPA, dan Sumber daya adaptor JCA. mis. untuk menyiapkan referensi ke EJB lain & Transaksi JTA & manajer entitas JPA & pabrik koneksi JMS dan antrian:

    @Stateless
    public class MyAccountsBean {
    
        @EJB SomeOtherBeanClass someOtherBean;
        @Resource UserTransaction jtaTx;
        @PersistenceContext(unitName="AccountsPU") EntityManager em;
        @Resource QueueConnectionFactory accountsJMSfactory;
        @Resource Queue accountPaymentDestinationQueue;
    
        public List<Account> processAccounts(DepartmentId id) {
            // Use all of above instance variables with no additional setup.
            // They automatically partake in a (server coordinated) JTA transaction
        }
    }
    

    Servlet dapat memanggil kacang ini secara lokal, dengan hanya mendeklarasikan variabel instan:

    @EJB MyAccountsBean accountsBean;    
    

    dan kemudian hanya memanggil metode yang diinginkan.

  6. Interaksi cerdas dengan JPA. Secara default, EntityManager yang disuntikkan seperti di atas menggunakan konteks persistensi cakupan transaksi. Ini sempurna untuk sesi kacang tanpa kewarganegaraan. Ketika metode EJB (stateless) dipanggil, konteks kegigihan baru dibuat dalam transaksi baru, semua instance objek entitas yang diambil / ditulis ke DB hanya terlihat dalam pemanggilan metode tersebut dan diisolasi dari metode lain. Tetapi jika EJB stateless lainnya dipanggil dengan metode ini, kontainer menyebarkan dan membagikan PC yang sama kepada mereka, sehingga entitas yang sama secara otomatis dibagi secara konsisten melalui PC dalam transaksi yang sama.
    Jika bean sesi @Stateful dideklarasikan, afinitas smart yang sama dengan JPA dicapai dengan mendeklarasikan entitasManager sebagai lingkup yang diperluas: @PersistentContent (unitName = "AccountsPU, tipe = EXTENDED). Ini ada selama masa sesi bean, lintas beberapa panggilan kacang dan transaksi, caching salinan dalam-memori entitas DB yang sebelumnya diambil / ditulis sehingga mereka tidak perlu diambil kembali.

  7. Manajemen Siklus Hidup. Siklus hidup EJB dikelola wadah. Seperti yang diperlukan, itu menciptakan instance EJB, membersihkan dan menginisialisasi state state sesi kacang, pasif & mengaktifkan, dan memanggil metode panggilan balik siklus hidup, sehingga kode EJB dapat berpartisipasi dalam operasi siklus untuk memperoleh dan melepaskan sumber daya, atau melakukan inisialisasi dan perilaku penutupan lainnya. Itu juga menangkap semua pengecualian, mencatatnya, memutar kembali transaksi sesuai kebutuhan, dan melempar pengecualian EJB baru atau @ApplicationExceptions sesuai kebutuhan.

  8. Manajemen keamanan. Kontrol akses berbasis peran untuk EJBs dapat dikonfigurasi melalui anotasi sederhana atau pengaturan XML. Server secara otomatis meneruskan rincian pengguna yang diautentikasi bersama dengan setiap panggilan sebagai konteks keamanan (prinsip dan peran panggilan). Ini memastikan bahwa semua aturan RBAC ditegakkan secara otomatis sehingga metode tidak dapat secara ilegal dipanggil oleh peran yang salah. Hal ini memungkinkan EJB untuk dengan mudah mengakses detail peran / pengguna untuk pemeriksaan programatik tambahan. Ini memungkinkan penyumbatan dalam pemrosesan keamanan ekstra (atau bahkan alat IAM) ke wadah dengan cara standar.

  9. Standardisasi & Portabilitas. Implementasi EJB sesuai dengan standar Java EE dan konvensi pengkodean, mempromosikan kualitas dan kemudahan pemahaman dan pemeliharaan. Ini juga mempromosikan portabilitas kode ke server aplikasi vendor baru, dengan memastikan semuanya mendukung fitur dan perilaku standar yang sama, dan dengan mencegah pengembang untuk secara tidak sengaja mengadopsi
    fitur vendor non-portabel yang dipatenkan .

  10. The Real Kicker: Kesederhanaan. Semua hal di atas dapat dilakukan dengan kode yang sangat ramping - baik menggunakan pengaturan default untuk EJB dalam Java EE 6, atau menambahkan beberapa anotasi. Pengkodean fitur perusahaan / kekuatan industri di POJO Anda sendiri akan jauh lebih banyak, kompleks dan rawan kesalahan. Setelah Anda mulai membuat kode dengan EJB, mereka agak mudah dikembangkan dan memberikan manfaat "perjalanan gratis" yang hebat.

Dalam spesifikasi EJB asli 10 tahun yang lalu, EJB adalah masalah produktivitas utama. Mereka bengkak, membutuhkan banyak kode dan artefak konfigurasi dan memberikan sekitar 2/3 dari manfaat di atas. Sebagian besar proyek web tidak menggunakannya. Tetapi ini telah berubah secara signifikan dengan 10 tahun penyesuaian, perbaikan, peningkatan fungsional dan pengembangan aliran arus. Di Java EE 6 mereka memberikan kekuatan industri tingkat maksimum dan kesederhanaan penggunaan.

Apa yang tidak disukai ?? :-) :-)

Glen Best
sumber
67

EJB adalah komponen Java, yang berisi logika bisnis, yang Anda gunakan dalam wadah, dan yang mendapat manfaat dari layanan teknis yang disediakan oleh wadah, biasanya dengan cara deklaratif, berkat anotasi:

  • manajemen transaksi: transaksi dapat dimulai secara otomatis sebelum metode EJB dipanggil, dan dilakukan atau dikembalikan setelah metode ini kembali. Konteks transaksional ini disebarkan ke panggilan ke EJB lain.
  • manajemen keamanan: pemeriksaan dapat dilakukan bahwa penelepon memiliki peran yang diperlukan untuk menjalankan metode ini.
  • injeksi ketergantungan: EJB lain, atau sumber daya seperti manajer entitas JPA, sumber data JDBC, dll. dapat disuntikkan ke dalam EJB.
  • concurrency: wadah memastikan bahwa hanya satu utas pada satu waktu memanggil metode instance EJB Anda.
  • distribusi: beberapa EJB dapat disebut dari jarak jauh, dari JVM lain.
  • failover dan load-balancing: klien jarak jauh dari EJB Anda dapat secara otomatis mengalihkan panggilan mereka ke server lain jika perlu.
  • manajemen sumber daya: stateful beans dapat secara otomatis dipasif ke disk untuk membatasi konsumsi memori server Anda.
  • ... Saya mungkin sudah lupa beberapa poin.
JB Nizet
sumber
Ketika Anda merujuk pada transaksi - Anda merujuk pada ketekunan?
jacktrades
6
Ya, tetapi tidak hanya. Wadah EJB menyediakan manajer transaksi JTA terdistribusi, mendukung banyak sumber daya dalam satu transaksi. Misalnya Anda dapat memperbarui beberapa data dalam database, dan mengirim beberapa pesan JMS, dalam satu transaksi. Jika ada yang gagal, semuanya akan mundur: pembaruan DB dan pesan yang dikirim.
JB Nizet
@JBNizet permisi untuk mengomentari utas lama, tapi BUKAN kerangka kerja EJB seperti Spring menyediakan layanan ini yang Anda sebutkan. saya tidak mengerti perbedaannya
MoienGK
Prinsip dasarnya sama. Spring mengambil ide dari EJBs dan sebaliknya. Tetapi API, implementasi, cara untuk menyebarkan, dan beberapa fitur berbeda.
JB Nizet
@JB Nizet Dalam pola MVC, di mana Anda akan menempatkan EJB secara umum? Saya akan mengatakan mereka milik lapisan Model, meskipun saya tahu banyak orang yang mengatakan mereka adalah pengendali. Jika EJB berisi logika bisnis (Anda bilang begitu), maka mereka adalah model layer menurut definisi.
user107986
22

Semoga ini dari Oracle doc akan membantu orang seperti saya untuk memahami topik EJB dengan cara yang sederhana.

Apa itu Enterprise Bean? Ditulis dalam bahasa pemrograman Java, kacang perusahaan adalah komponen sisi server yang merangkum logika bisnis suatu aplikasi. Logika bisnis adalah kode yang memenuhi tujuan aplikasi. Dalam aplikasi kontrol inventaris, misalnya, kacang perusahaan mungkin menerapkan logika bisnis dalam metode yang disebut checkInventoryLevel dan orderProduct. Dengan menerapkan metode ini, klien dapat mengakses layanan inventaris yang disediakan oleh aplikasi.

Manfaat Kacang Perusahaan Karena beberapa alasan, kacang usaha menyederhanakan pengembangan aplikasi terdistribusi yang besar. Pertama, karena wadah EJB menyediakan layanan tingkat sistem untuk kacang perusahaan, pengembang kacang dapat berkonsentrasi untuk memecahkan masalah bisnis. Wadah EJB, bukan pengembang kacang, bertanggung jawab untuk layanan tingkat sistem seperti manajemen transaksi dan otorisasi keamanan.

Kedua, karena kacang daripada klien mengandung logika bisnis aplikasi, pengembang klien dapat fokus pada presentasi klien. Pengembang klien tidak harus membuat kode rutin yang menerapkan aturan bisnis atau mengakses database. Akibatnya, klien lebih tipis, manfaat yang sangat penting bagi klien yang berjalan pada perangkat kecil.

Ketiga, karena kacang perusahaan adalah komponen portabel, assembler aplikasi dapat membangun aplikasi baru dari kacang yang sudah ada. Aplikasi-aplikasi ini dapat berjalan di server Java EE mana pun yang memenuhi syarat asalkan mereka menggunakan API standar.

Kapan Menggunakan Kacang Perusahaan Anda harus mempertimbangkan untuk menggunakan kacang perusahaan jika aplikasi Anda memiliki salah satu dari persyaratan berikut:

Aplikasi harus scalable. Untuk mengakomodasi semakin banyak pengguna, Anda mungkin perlu mendistribusikan komponen aplikasi di beberapa mesin. Tidak hanya kacang perusahaan dari aplikasi yang berjalan pada mesin yang berbeda, tetapi juga lokasi mereka akan tetap transparan bagi klien.

Transaksi harus memastikan integritas data. Enterprise bean mendukung transaksi, mekanisme yang mengatur akses bersamaan dari objek yang dibagikan.

Aplikasi ini akan memiliki beragam klien. Dengan hanya beberapa baris kode, klien jarak jauh dapat dengan mudah menemukan kacang perusahaan. Klien-klien ini bisa tipis, beragam, dan banyak.

Tesfa Zelalem
sumber
3

Pertanyaan yang paling menarik minat saya adalah bagaimana dan di mana saya bisa menggunakannya. Untuk memahami hal ini, pertama-tama kita perlu melihat jenis-jenis EJB yang ada. Ada 2 kategori besar:

  1. Kacang sesi
  2. Kacang yang digerakkan oleh pesan

Mari kita pertimbangkan Session Beans. Ada 3 jenis:

  1. Stateful - komponen ini mempertahankan status dan spesifik untuk klien di beberapa permintaan. Lihat sebagai sesi. Penggunaan langsung yang bisa dilakukan adalah gerobak belanja atau sesi jenis lain (sesi login dan sebagainya)
  2. Tanpa kewarganegaraan - ini adalah komponen mandiri yang tidak menyimpan informasi di antara permintaan, tetapi mereka unik bagi pengguna. Penggunaan segera yang muncul di benak - Kelas layanan di lapisan layanan . Bayangkan OrderService. Penggunaan besar lainnya adalah untuk mengekspos layanan web. Sekali lagi, ini berada di lapisan Layanan atau benar-benar terpisah.
  3. Singleton - ini adalah kacang yang ada per aplikasi dan dibuat sekali dan dapat digunakan kembali / diakses beberapa kali. Segera Configurationkomponen tersebut muncul di benak - di mana Anda dapat menyimpan konfigurasi level aplikasi dan mengaksesnya saat Anda membutuhkannya dari mana saja.

Sekarang sisa kemampuan atau fitur dapat digunakan lintas lapisan dalam situasi seperti itu:

  • Keamanan - Anda dapat memeriksa izin dengan anotasi pada metode yang dipanggil. Ini bisa terjadi di lapisan Layanan maupun di Kontrol jika Anda menginginkannya.
  • Manajemen transaksi - ini adalah kandidat yang jelas di lapisan Layanan atau lapisan Persistensi
  • Ketergantungan Injeksi - lagi akan digunakan di mana-mana

Salah satu penggunaan besar di zaman modern adalah apa yang disebut Microservices dan Arsitektur Berorientasi Layanan. Anda dapat mengemas beberapa komponen logika bisnis sebagai EJB dan mendistribusikannya di seluruh organisasi, untuk digunakan oleh banyak klien (oleh klien di sini maksud saya aplikasi back-end lainnya).

Dan seterusnya. Sekarang kelemahan terbesarnya adalah Anda menjadi sangat bergantung pada wadah EJB dan meskipun Anda dapat beralih di antara 2 implementasi referensi, Anda tidak akan dapat beralih ke sesuatu yang lebih ringan - Tomcat misalnya. Tetapi mengapa Anda ingin mengorbankan semua manfaatnya?

ACV
sumber