Monday, March 30, 2009

Stateless Session Bean Overview

Salah satu komponen yang dimiliki EJB adalah session bean. Session bean digunakan untuk memodelkan bisnis proses. Ada dua jenis session bean yaitu stateless dan stateful. Stateless session bean digunakan untuk memodelkan proses yang bisa dilakukan dalam satu method call seperti memasukkan dokumen penawaran di sistem lelang, memasukkan data obat di sistem kesehatan, dll.

Session bean, baik stateful maupun stateless, mempunyai struktur yang sama yaitu terdiri dari sebuah POJI (Plain Old Java Interface) dan sebuah POJO (Plain Old Java Object). Keduanya tidak perlu extend class atau implements interface apapun.

Contoh stateless session bean

@Remote
public interface ItemManager {

public Item addItem(String itemTitle, String itemDesc, User seller, Set categories);
public void deleteItem(Item item);
public void updateItem(Item item);
public void undoChangeItem(Item item);
public Item findItem(Long itemId);
public List findAllItem();
public List findItemByTitle(String itemTitle);
public List findItemBySeller(Long sellerId);
public List findAllItem(int maxResult, int initialRow);
}

POJI hanya perlu menambahkan sebuah annotation @Remote atau @Local saja. @Remote berarti bean bisa diakses secara remote lewat RMI oleh client. @Local annotation berarti bahwa POJI tsb hanya bisa diakses secara lokal oleh komponen-komponen dari dalam EJB container.

@Stateless
public class ItemManagerBean implements ItemManager {

public Item addItem(String itemTitle, String itemDesc, User seller, Set categories) {
// TODO:
}

public void deleteItem(Item item) {
// TODO:
}

public void undoChangeItem(Item item) {
// TODO:
}

public void updateItem(Item item) {
// TODO:
}

public Item findItem(Long itemId) {
// TODO:
}

public List findAllItem() {
// TODO:
}

public List findItemByTitle(String itemTitle) {
// TODO:
}

public List findItemBySeller(Long sellerId) {
// TODO:
}

public List findAllItem(int maxResult, int initialRow) {
// TODO:
}

}

POJO hanya perlu implements POJI yang sudah dibuat sebelumnya. @Stateless memberitahu EJB container bahwa class tsb adalah stateless session bean. Selanjutnya EJB container akan menyediakan service-service untuk stateless session bean tsb seperti pooling, transaction management, dll.

Untuk memanggil bean di atas dari sebuah client cukup dengan annotation @EJB saja seperti berikut

@EJB
private static ItemManager itemManager;
public static void main(String args[]) {
Item myItem1 = itemManager.findItem(2L);
myItem1.setItemTitle("Pintu Ajaib");
itemManager.updateItem(myItem1);
}

Dengan menggunakan @EJB, container menangani semua hal yang berhubungan dengan bean tsb. Behind the scene, saat container mendapati annotation maka container melakukan lookup dan mengeset nilai
itemManager dengan reference hasil lookup tsb. Jika tidak ada annotation @EJB, maka nilai itemManager akan tetap null dan saat kita mengaksesnya dari method main maka yang muncul adalah NullPointerException. Penggunaan annotation untuk lookup ini yang dikenal dengan istilah Dependency Injection.

Bagaimana lifecycle stateless session bean? Jika bean berada dalam EJB container, maka bean tsb disebut container-managed bean. Artinya container bertanggung jawab terhadap lifecycle bean mulai dari kapan bean diciptakan, kapan dependency injection berjalan, kapan bean dimusnahkan, dan kapan melakukan optimalisasi saat dibutuhkan. Stateless session bean memiliki 2 lifecycle, creation dan destruction, dan keduanya ditangani EJB container.

Lifecycle session bean dimulai ketika instance diciptakan. Hal ini terjadi biasanya ketika client melakukan lookup ke bean tsb melalui JNDI atau dependency injection. Berkaitan dengan lifecycle bean tsb, ada dua callback method yang bisa dijalankan masing-masing pada saat creation dan destruction. Method tersebut bisa kita tentukan di dalam session bean dengan menggunakan annotation @PostConstruct dan @PreDestroy, masing-masing untuk creation dan destruction.

Seperti telah saya sebutkan di atas bahwa stateless session bean digunakan untuk memodelkan proses bisnis yang bisa dilakukan dengan satu method call. Ini berarti bahwa kita tidak boleh menyimpan suatu nilai pada class variable session bean untuk digunakan kemudian. Mengapa? Hal ini disebabkan cara EJB container yang mengorganisir stateless session menggunakan pooling sehingga tidak dapat dipastikan bahwa sebuah client selalu dilayani oleh bean yang sama. Selain itu imbas penggunaan pooling adalah resource yang digunakan dapat dimaksimalkan karena server tidak akan dibebani oleh banyaknya bean yang bergentayangan.

0 comments:

 

©2009 Stay the Same | by TNB