EJB's - kapan harus menggunakan Remote dan / atau antarmuka lokal?

180

Saya sangat baru di Java EE dan saya mencoba memahami konsep antarmuka lokal dan antarmuka jarak jauh. Saya telah diberitahu bahwa salah satu keuntungan besar Java EE adalah mudah untuk skala (yang saya percaya berarti Anda dapat menggunakan komponen yang berbeda pada server yang berbeda). Apakah itu tempat antarmuka Remote dan Lokal masuk? Apakah Anda seharusnya menggunakan antarmuka jauh jika Anda mengharapkan aplikasi Anda memiliki komponen yang berbeda pada server yang berbeda? Dan gunakan antarmuka lokal jika aplikasi Anda hanya akan berada di satu server?

Jika asumsi saya di atas benar, bagaimana cara Anda memilih apakah akan menggunakan antarmuka Lokal atau Remote untuk aplikasi baru, di mana Anda tidak yakin akan berapa volume lalu lintas? Mulailah dengan menggunakan antarmuka lokal, dan secara bertahap tingkatkan ke antarmuka jarak jauh di mana berlaku?

Terima kasih atas klarifikasi dan saran.

Brian DiCasa
sumber

Jawaban:

186

Saya sangat baru di Java EE dan saya mencoba memahami konsep antarmuka lokal dan antarmuka jarak jauh.

Dalam versi awal spesifikasi EJB, EJB "diasumsikan" sebagai komponen jarak jauh dan satu-satunya cara untuk memintanya adalah dengan membuat panggilan jarak jauh, menggunakan semantik RMI dan semua overhead yang disiratkan (panggilan jaringan dan objek serialisasi untuk setiap panggilan metode). Klien EJB harus membayar penalti kinerja ini bahkan ketika ditempatkan di mesin virtual yang sama dengan wadah EJB.

Kemudian, Sun menyadari sebagian besar aplikasi bisnis sebenarnya tidak mendistribusikan EJB pada tingkat yang berbeda dan mereka memperbaiki spec (dalam EJB 2.0) dengan memperkenalkan konsep antarmuka lokal sehingga klien yang ditempatkan di mesin virtual yang sama dengan wadah EJB dapat memanggil EJB menggunakan doa metode langsung, benar-benar melewati semantik RMI (dan overhead terkait).

Saya telah diberitahu bahwa salah satu keuntungan besar Java EE adalah mudah untuk menskalakan (yang saya percaya berarti Anda dapat menggunakan komponen yang berbeda pada server yang berbeda)

Java EE dapat menskala, tetapi ini tidak berarti mendistribusikan komponen. Anda bisa menjalankan aplikasi Web + EJB pada sebuah cluster tanpa memisahkan tingkat Web dan tingkat EJB.

Apakah Anda seharusnya menggunakan antarmuka jauh jika Anda mengharapkan aplikasi Anda memiliki komponen yang berbeda pada server yang berbeda? Dan gunakan antarmuka lokal jika aplikasi Anda hanya akan berada di satu server?

Saya ingin ungkapannya seperti ini: gunakan antarmuka jarak jauh jika klien tidak berada dalam JVM yang sama (ini tidak berarti hanya menggunakan satu server / JVM).

(...) Mulailah dengan menggunakan antarmuka lokal, dan secara bertahap tingkatkan ke antarmuka jarak jauh di mana berlaku?

Saya mungkin akan mulai dengan menggunakan antarmuka lokal. Dan seperti yang sudah ditunjukkan, beralih ke antarmuka jarak jauh tidak selalu wajib (Anda dapat mengelompokkan yang dilokasi struktur yang ).

Saya sarankan untuk memeriksa sumber daya yang disebutkan di bawah (2 yang pertama sudah cukup tua tetapi masih relevan, 2 lainnya lebih baru).

Sumber daya

Thivent Pascal
sumber
2
Saya menemukan pertanyaan ini menarik. Apa yang Anda maksud dengan "beralih ke antarmuka jarak jauh tidak mutlak wajib"? Apakah itu berarti ketika Anda menambahkan klien baru di luar JVM yang sama, Anda tidak perlu membuat antarmuka jarak jauh?
mohamida
2
@Josek Terima kasih, senang Anda menyukainya @mohamida Saya membuat sedikit perubahan pada kata-katanya. Yang saya maksudkan adalah Anda dapat mengelompokkan struktur yang dilokasikan.
Pascal Thivent
1
Terima kasih atas jawabannya dan sumber daya tambahan, mereka sangat membantu. Sepertinya ada beberapa cara penskalaan aplikasi web ... yaitu mendistribusikan komponen (yang saya anggap sebagai memecah tingkatan yang berbeda ke JVM yang berbeda?) Atau menggunakan load balancing (yang akan membuat seluruh aplikasi aktif banyak server?) dan saya kira Anda bisa menggunakan kombinasi keduanya? Apakah Anda, secara kebetulan, mengetahui buku-buku bagus tentang topik ini? Terima kasih lagi!
Brian DiCasa
2
@ Brian It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?Ya, memang begitu. Do you, by chance know of good books on this topic?Sayangnya, tidak, saya tidak tahu sumber daya absolut "ZE", jika ada. Saya telah menambahkan lebih banyak sumber daya dengan beberapa referensi.
Pascal Thivent
tautan sumber daya pertama sudah mati
Viacheslav Dobromyslov
48

Meskipun saya setuju dengan sebagian besar dari apa yang ditulis di atas, saya ingin sedikit memperbaiki ide "bagaimana memulai".

Saran saya kepada Anda adalah untuk tidak pernah memprogram secara langsung ke antarmuka EJB dalam kode Anda. Selalu gunakan antarmuka reguler, berorientasi bisnis, program untuk itu (artinya, minta metode panggilan kode Anda pada antarmuka berorientasi bisnis) dan berikan kode "lem" EJB sebagai implementasi yang dapat dicolokkan. Program Anda harus fokus pada logika bisnis, dan bukan pada detail implementasi seperti EJB.

Dengan begitu, Anda dapat dengan mudah beralih antara implementasi jarak jauh dan lokal - dan jika Anda menggunakan wadah IoC seperti Spring, Anda dapat melakukannya dengan hanya menggunakan konfigurasi.

Catatan khusus tentang beralih dari lokal ke jarak jauh: perhatikan bahwa ada beberapa perbedaan semantik antara keduanya. Sebagai contoh, memanggil metode EJB melalui "antarmuka jarak jauh" menghasilkan argumen yang dilewatkan oleh nilai, sementara memanggil melalui "antarmuka lokal" menghasilkan argumen yang dilewatkan oleh referensi. Ini adalah perbedaan utama ; jadi jika Anda "mulai dengan lokal", pastikan bahwa Anda merancang sistem Anda dengan cara yang mengambil semantik "jarak jauh" menjadi pertimbangan juga.

Jika desain Anda mengandalkan metode EJB mengubah objek yang lewat, maka akan sulit bagi Anda untuk "beralih ke jarak jauh" nanti; bahkan mungkin mustahil.

Semoga berhasil.

Ishak
sumber
2
Kedengarannya seperti alasan lain untuk meminimalkan mutabilitas per java efektif. Apakah ini membantu dalam fleksibilitas untuk "beralih ke jarak jauh" untuk antarmuka jenis RMI dengan EJB?
Thufir
19

Menurut EJB Spec 3.2, EJB dapat berupa lokal atau jarak jauh . Antarmuka bisnis tidak bisa bersifat lokal dan jarak jauh pada saat yang sama.

@Local kacang beranotasi hanya dapat diakses jika berada dalam aplikasi yang sama.

@Remote kacang beranotasi dapat diakses di aplikasi yang berbeda, berada di jvms yang berbeda atau di server aplikasi.

Jadi hal-hal penting yang perlu diingat adalah:

  1. Jika kelas kacang berisi @Remoteanotasi, maka semua antarmuka yang diimplementasikan harus jauh.
  2. Jika kelas kacang tidak mengandung anotasi atau jika @Local anotasi ditentukan, maka semua antarmuka yang diimplementasikan diasumsikan lokal.
  3. Setiap antarmuka yang secara eksplisit didefinisikan untuk kacang yang tidak mengandung antarmuka harus dinyatakan sebagai @Local.
  4. Rilis EJB 3.2 cenderung memberikan lebih banyak rincian untuk situasi di mana antarmuka lokal dan jarak jauh perlu didefinisikan secara eksplisit.
Pritam Banerjee
sumber
1
Pertanyaan: Bisakah Anda menggunakan @Localuntuk memohon EJB di aplikasi lain (JAR, WAR, EAR), tetapi JVM yang sama?
Carlitos Way
@PritamBanerjee Ada gagasan tentang Carlitos Wa, saya juga menghadapi masalah yang sama. EJB berada di cluster yang berbeda dan aplikasi servlet klien berbeda.
Govi S
@ GovindaSakhare Saya tidak yakin tentang itu. Maaf :(
Pritam Banerjee
7

Ini dapat menjawab kekhawatiran Anda:

Secara umum, Enterprise Java Bean Anda akan memerlukan tampilan klien jarak jauh jika Anda berencana untuk menggunakan kacang di lingkungan terdistribusi. Secara khusus, ini adalah kasus-kasus ketika klien yang akan bekerja dengannya akan berada di Java Virtual Machine (JVM) yang berbeda. Dalam kasus tampilan klien jarak jauh, memanggil metode apa pun dari antarmuka rumah jarak jauh dan / atau antarmuka komponen jarak jauh akan ditangani melalui doa metode jarak jauh (RMI).

EJB dapat menggunakan tampilan klien lokal hanya jika benar-benar dijamin bahwa kacang perusahaan lain atau klien hanya akan membahas kacang dalam JVM tunggal. Jika demikian, akses tersebut akan dilakukan dengan pemanggilan metode langsung, bukan RMI.

Sumber: http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text

Abdulaziz
sumber