Kacang Sesi Java EE

1. Perkenalan

Kacang Sesi Perusahaan secara luas dapat diklasifikasikan menjadi:

  1. Kacang Sesi Stateless
  2. Kacang Sesi Stateful

Dalam artikel singkat ini, kita akan membahas dua jenis kacang sesi utama.

2. Penyiapan

Untuk menggunakan Enterprise Beans 3.2 , pastikan untuk menambahkan versi terbaru ke bagian dependensi di file pom.xml :

 javax javaee-api 7.0 provided 
Ketergantungan terbaru dapat ditemukan di Maven Repository. Ketergantungan ini memastikan bahwa semua Java EE 7 API tersedia selama waktu kompilasi. Ruang lingkup yang disediakan memastikan bahwa setelah digunakan; ketergantungan akan disediakan oleh penampung tempat ia telah diterapkan.

3. Kacang Tanpa Negara

Kacang sesi tanpa negara adalah jenis kacang perusahaan yang biasanya digunakan untuk melakukan operasi independen. Itu tidak memiliki status klien terkait, tetapi dapat mempertahankan status instance-nya.

Mari kita lihat contoh untuk mendemonstrasikan cara kerja kacang tanpa kewarganegaraan.

3.1 Membuat Kacang Stateless

Pertama, mari buat kacang StatelessEJB . Kami menggunakan anotasi @Stateless untuk menandai kacang sebagai stateless:

@Stateless public class StatelessEJB { public String name; }

Kemudian kami membuat klien pertama dari kacang tanpa kewarganegaraan di atas, yang disebut EJBClient1 :

public class EJBClient1 { @EJB public StatelessEJB statelessEJB; }

Kami kemudian mendeklarasikan klien lain, bernama EJBClient2, yang mengakses kacang tanpa kewarganegaraan yang sama:

public class EJBClient2 { @EJB public StatelessEJB statelessEJB; }

3.2 Menguji Kacang Stateless

Untuk menguji statelessness dari EJB, kita dapat menggunakan dua klien yang kita nyatakan di atas dengan cara berikut:

@RunWith(Arquillian.class) public class StatelessEJBTest { @Inject private EJBClient1 ejbClient1; @Inject private EJBClient2 ejbClient2; @Test public void givenOneStatelessBean_whenStateIsSetInOneBean _secondBeanShouldHaveSameState() { ejbClient1.statelessEJB.name = "Client 1"; assertEquals("Client 1", ejbClient1.statelessEJB.name); assertEquals("Client 1", ejbClient2.statelessEJB.name); } @Test public void givenOneStatelessBean_whenStateIsSetInBothBeans _secondBeanShouldHaveSecondBeanState() { ejbClient1.statelessEJB.name = "Client 1"; ejbClient2.statelessEJB.name = "Client 2"; assertEquals("Client 2", ejbClient2.statelessEJB.name); } // Arquillian setup code removed for brevity }

Kami mulai dengan menyuntikkan dua klien EBJ ke dalam pengujian unit.

Kemudian, dalam metode pengujian pertama, kami menetapkan variabel nama di EJB yang diinjeksikan ke EJBClient1 ke nilai Klien 1. Sekarang, ketika kami membandingkan nilai variabel nama di kedua klien, kami akan melihat bahwa nilainya sama . Ini menunjukkan bahwa negara tidak dipertahankan dalam kacang tanpa kewarganegaraan .

Mari kita tunjukkan bahwa ini benar dengan cara yang berbeda. Dalam metode pengujian kedua, kita melihat bahwa setelah kita menetapkan variabel nama di klien kedua, itu 'menimpa' nilai apa pun yang diberikan kepadanya melalui ejbClient1 .

4. Kacang Stateful

Kacang sesi stateful mempertahankan status baik di dalam dan di antara transaksi. Itulah mengapa setiap kacang sesi berstatus dikaitkan dengan klien tertentu. Penampung dapat menyimpan dan mengambil status kacang secara otomatis sambil mengelola kumpulan instance kacang sesi berstatus.

4.1 Membuat Stateful Bean

Kacang sesi stateful ditandai dengan anotasi @Stateful . Kode untuk stateful bean adalah sebagai berikut:

@Stateful public class StatefulEJB { public String name; }

Klien lokal pertama untuk kacang stateful kami ditulis sebagai berikut:

public class EJBClient1 { @EJB public StatefulEJB statefulEJB; }

Klien kedua yang disebut EJBClient2 juga dibuat seperti EJBClient1 :

public class EJBClient2 { @EJB public StatefulEJB statefulEJB; }

4.2 Menguji Stateful Bean

Fungsionalitas kacang stateful diuji dalam pengujian unit EJBStatefulBeanTest dengan cara berikut:

@RunWith(Arquillian.class) public class StatefulEJBTest { @Inject private EJBClient1 ejbClient1; @Inject private EJBClient2 ejbClient2; @Test public void givenOneStatefulBean_whenTwoClientsSetValueOnBean _thenClientStateIsMaintained() { ejbClient1.statefulEJB.name = "Client 1"; ejbClient2.statefulEJB.name = "Client 2"; assertNotEquals(ejbClient1.statefulEJB.name, ejbClient2.statefulEJB.name); assertEquals("Client 1", ejbClient1.statefulEJB.name); assertEquals("Client 2", ejbClient2.statefulEJB.name); } // Arquillian setup code removed for brevity }

Seperti sebelumnya, dua klien EJB diinjeksi ke dalam unit test. Dalam metode pengujian, kita dapat melihat bahwa nilai variabel nama ditetapkan melalui klien ejbClient1 dan dipertahankan meskipun nilai nama yang ditetapkan melalui ejbClient2 berbeda. Ini menunjukkan bahwa status EJB dipertahankan .

5. Kacang Sesi Stateless vs. Stateful

Sekarang mari kita lihat perbedaan utama antara kedua jenis kacang sesi.

5.1 Kacang Tanpa Kewarganegaraan

  • Kacang sesi tanpa status tidak mempertahankan status dengan klien. Untuk alasan ini, mereka dapat digunakan untuk membuat kumpulan objek yang berinteraksi dengan banyak klien
  • Karena kacang stateless tidak memiliki status apa pun per klien, mereka memiliki kinerja yang lebih baik
  • Mereka dapat menangani banyak permintaan dari banyak klien secara paralel dan
  • Dapat digunakan untuk mengambil objek dari database

5.2 Kacang Stateful

  • Kacang sesi stateful dapat mempertahankan status dengan banyak klien, dan tugas tidak dibagikan di antara klien
  • Status berlangsung selama sesi. Setelah sesi dihancurkan, status tidak dipertahankan
  • Penampung dapat membuat serial dan menyimpan status sebagai status usang untuk digunakan di masa mendatang. Ini dilakukan untuk menghemat sumber daya server aplikasi dan untuk mendukung kegagalan kacang dan pasif
  • Dapat digunakan untuk memecahkan masalah tipe produsen-konsumen

6. Kesimpulan

Jadi kami telah membuat dua jenis kacang sesi dan klien yang sesuai untuk menjalankan metode dari kacang. Proyek ini mendemonstrasikan perilaku dari dua jenis kacang sesi utama.

Seperti biasa, kode sumber artikel tersedia di GitHub.