Apa itu EJB? Evolusi Enterprise JavaBeans

Enterprise JavaBeans (EJB) adalah spesifikasi untuk mengembangkan aplikasi bisnis berskala besar dan tersebar di platform Java. EJB 1.0 dirilis pada tahun 1998. Rilis terbaru, EJB 3.2.3, telah diadopsi untuk dimasukkan ke dalam Jakarta EE, di mana akan diganti namanya sebagai Jakarta Enterprise Beans.

Senibina EJB

Senibina EJB terdiri daripada tiga komponen utama: kacang perusahaan (EJB), wadah EJB, dan pelayan aplikasi Java. EJB berjalan di dalam bekas EJB, dan kontena EJB berjalan di dalam pelayan aplikasi Java.

Terdapat dua jenis EJB - kacang sesi dan kacang berdasarkan pesanan:

  • Biji sesi dipanggil oleh pelanggan dan menjadikan fungsi perusahaan seperti urus niaga dan pengurusan sumber tersedia untuk pelanggan secara teratur.
  • Kacang yang didorong oleh mesej juga merangkumi dan memberikan fungsi perusahaan, tetapi ia tidak segerak dan berdasarkan peristiwa. Kacang yang didorong oleh mesej mendengar dan menanggapi peristiwa, dan tidak boleh dipanggil oleh pelanggan.

Setelah digunakan untuk memberikan ketekunan dalam sistem EJB, kacang entitas telah diganti oleh Java Persistence API. Teruskan membaca untuk mengetahui lebih lanjut mengenai kacang sesi dan kacang berdasarkan pesanan.

EJB vs JavaBeans

Enterprise JavaBeans adalah model pengembangan berbasis komponen pertama untuk Java EE. EJB serupa dengan JavaBeans sebagai komponen berdasarkan, tetapi di situlah kesamaan berakhir:

  • A JavaBean adalah kelas Java yang merangkumi pelbagai objek dan mematuhi konvensyen tertentu. JavaBeans digunakan terutama untuk pengembangan sisi klien.
  • An kacang perusahaan (EJB) adalah kelas Java disemai dengan keupayaan-pelayan tertentu. Kacang perusahaan digunakan dalam aplikasi dan sistem perniagaan berskala besar.

Kacang sesi

A kacang sesi adalah jenis generik sebahagian besar kacang perusahaan, yang mewakili sebahagian fungsi perniagaan yang boleh dipanggil oleh pelanggan. Pelanggan dalam kes ini boleh menjadi kelas lain di JVM tempatan atau panggilan jarak jauh.

Bekas EJB menguruskan kitaran hidup kacang sesi, yang ditentukan oleh keadaan kacang:

  • Biji sesi tanpa status serupa dengan ruang lingkup permintaan di Java Servlet API. Biji sesi tanpa status mengandungi sebilangan besar fungsi yang boleh dipanggil tetapi sebaliknya tidak dapat dihitung.
  • Kacang sesi yang bernas dikaitkan dengan satu pelanggan sahaja, dan melampirkan pada sesi pelanggan yang sedang berlangsung. Kacang sesi bernegara berfungsi sama dengan skop sesi di Servlet API.
  • Kacang singleton serupa dengan ruang lingkup aplikasi di Servlet API. Kacang sesi tunggal hanya ada sekali untuk setiap pelanggan.

Keselamatan benang dengan kacang sesi

Kacang sesi yang bernas hanya dapat diakses oleh satu pelanggan pada satu masa, jadi keselamatan benang dijamin ketika anda bekerja dengan kacang jenis ini. Kacang sesi tanpa biji dan kacang tunggal lebih fleksibel, membolehkan sambungan serentak, yang mesti diuruskan oleh pemaju. Anda bertanggungjawab untuk keselamatan benang ketika bekerja dengan jenis kacang ini.

Kacang berdasarkan pesanan

Kacang berasaskan pesanan (MDB) dipanggil melalui mesej JMS (Java Message Service). JMS berfungsi seperti corak Perintah yang diedarkan, di mana kacang yang didorong oleh pesan bertindak sebagai pendengar arahan. Apabila mesej tiba pada topik atau beratur, kacang yang didorong oleh mesej yang mendengar topik tersebut dipanggil.

Kacang berdasarkan pesanan tidak biasa digunakan seperti kacang sesi, tetapi kacang itu kuat. Menjadi tidak segerak dan berdasarkan peristiwa, mereka sangat berguna untuk pekerjaan yang lama dan penting untuk menjimatkan sumber.

Senibina paling ringkas terdiri daripada aplikasi EJB dan wadah dan pelayannya, yang berkoordinasi dengan perkhidmatan pesanan memproses MDB. Dalam pengeluaran, seni bina anda mungkin merangkumi komponen ketiga yang dikhaskan untuk memakan biji. Dalam pembangunan, semua komponen ini dapat dijalankan pada mesin tempatan yang sama.

Gambar 1 menunjukkan seni bina berdasarkan peristiwa khas dengan kacang berdasarkan pesanan.

Matthew Tyson

Bekerja dengan kacang berdasarkan mesej lebih banyak terlibat daripada menggunakan kacang sesi. Dalam persekitaran yang didorong oleh peristiwa, anda biasanya memerlukan broker mesej seperti ActiveMQ.

Walaupun kacang sesi lebih sederhana, dan dengan demikian lebih sering digunakan di EJB, seni bina berdasarkan acara telah menjadi popular, terutama dengan ledakan perkhidmatan mikro. 

Anotasi EJB

Mendefinisikan dan memakan kacang perusahaan adalah titik tolak bagi banyak pembangun sehingga EJB 3.0, yang memperkenalkan anotasi pada spesifikasi EJB. Anotasi menjadikannya sangat mudah untuk mengkonfigurasi kacang perusahaan untuk pelbagai fungsi yang terdapat di Java EE. Teruskan membaca untuk memulakan penjelasan EJB.

@Stateless: Tentukan kacang sesi tanpa status

Untuk menetapkan kelas sebagai kacang sesi tanpa status, anda menggunakan javax.ejb.Statelessanotasi, seperti yang ditunjukkan dalam Penyenaraian 1.

Penyenaraian 1. @ Contoh anotasi tanpa statistik

 import javax.ejb.Stateless; @Stateless public class MyStatelessBean { public String getGreeting() { return "Hello JavaWorld."; } } 

Kacang tanpa statik ini mengandungi tanda tangan sederhana yang tidak memerlukan argumen dan mengembalikan rentetan. Jangan biarkan kesederhanaan menipu anda: kacang ini boleh melakukan apa sahaja yang anda perlukan, termasuk berinteraksi dengan kacang, perkhidmatan, atau lapisan data aplikasi anda.

@EJB: Gunakan kacang sesi tanpa status

Setelah anda menentukan kacang sesi, menggunakannya sangat mudah:

Penyenaraian 2. Contoh penjelasan @EJB

 public class MyServlet extends HttpServlet { @EJB MyStatelessBean myEjb; public void doGet(HttpServletRequest request, HttpServletResponse response) { response.getWriter().write("EJB Says " + testStatelessEjb.getGreeting()); } } 

Here, we inject the stateless bean into a servlet, and then it's available for use. Notice how the bean is identified under the @EJB annotation. The "stateless" designation tells us this bean will not track the client. Because it's stateless, we also know this bean is subject to threading if it does any work outside the invoked method.

@Remote: Define a remote EJB interface

In the above examples, I assumed the EJB and EJB client were running in the same JVM. If the enterprise bean and its client are running in separate JVMs, then the EJB must define a @Remote interface. In this case, it's up to you to define and implement the interface, as shown in Listing 3.

Listing 3. @Remote annotation example

 @Remote public interface MyStatelessEjbRemote { String sayHello(String name); } 

The remote interface is sent to the client to invoke. Calls to it will then be fulfilled by the EJB's server-side implementation. The MyStatelessBean example in Listing 4 implements the remote interface.

Listing 4. Implementing a remote interface

 public class MyStatelessBean implements MyStatelessEjbRemote{ ... } 

A remote interface is implemented just like a normal class implementing an interface. As the consumer of a remote EJB, the client application must be able to access the class definition for the remote interface. You can package the class definition for the remote interface as a dependency JAR.

Local vs remote interface

While it's important to know how to implement a remote interface, in practice it's more common to use a local interface. The local interface is used by default and works whenever the EJB is invoked within the same JVM context. Using the remote interface comes into play when the application is distributed across multiple JVMs.

Stateful sessions beans and singleton beans

The process for defining and consuming stateful @Session beans and @Singleton beans is the same as what you've seen for @Stateless beans. Remember the semantics:

  • Multiple session beans can be instantiated and used for the same client.
  • A singleton bean will exist only once for the entire application.

Thread safety and scheduling with singletons

Thread safety is built in when you're working with session beans, but both stateless and singleton beans can be accessed concurrently by multiple clients. Developers are responsible for thread safety when implementing these types of beans.

Singleton beans offer some support for thread safety via the @Lock annotation. You can use the @Lock annotation on singleton bean methods to set read/write privileges for each method. The two options are @Lock(LockType.READ) or @Lock(LockType.WRITE), which is the default.

Another useful feature of singleton beans is the ability to schedule tasks in a simple way, using the @Schedule annotation. Listing 5 shows how to schedule a task daily at noon.

Listing 5. @Schedule annotation example

 @Singleton public class MySchedulerBean { @Schedule(hour = "12") void doIt() { System.out.println("Hello at Noon!"); } } 

CDI vs EJB

CDI, or Context and Dependency Injection is a newer enterprise specification that some developers have proposed could replace EJB.

At a high level, CDI offers a general-purpose component framework, while EJB stands out for its richly featured, individual components. Whereas CDI uses dependency injection to define and reference any software component, EJB components are more formally defined, with each offering a specific set of capabilities out of the box. Both specs are planned for future development as part of Jakarta EE, where the question of whether CDI should replace EJB will eventually be resolved.

Conclusion

Enterprise JavaBeans adalah spesifikasi pertama yang menawarkan cara mudah merangkum dan menggunakan kembali logik perniagaan dalam aplikasi Java perusahaan. Jauh dari raksasa lama, EJB hari ini adalah rangka kerja berasaskan anotasi yang ramping yang membolehkan anda mengakses pelbagai fungsi perusahaan, langsung dari kotak. Pertimbangkan EJB pada saat anda diminta untuk segera meningkatkan aplikasi perniagaan yang diedarkan dan dapat diskalakan. Anda mungkin terkejut.

Kisah ini, "Apa itu EJB? Evolusi Enterprise JavaBeans" awalnya diterbitkan oleh JavaWorld.