Tuesday, March 31, 2009

Stateful Session Bean Overview

Selain stateless session bean, ada satu lagi komponen EJB yang menarik untuk diketahui, stateful session bean. Stateful session bean digunakan untuk memodelkan bisnis proses yang harus dilakukan dalam beberapa tahap seperti memasukkan data untuk registrasi dimana pertama kali kita harus mengisi data pribadi dan kemudian menekan tombol next untuk mengisi data riwayat pekerjaan kemudian menekan tombol next lagi untuk mengisi data yang lain. Dan dalam setiap tahap, aplikasi perlu menyimpan state atau informasi yang telah dimasukkan pada tahap sebelumnya di memori.

Struktur stateful session bean sama dengan stateless session bean 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 stateful session bean

@Remote
public interface ShoppingCart {
public void initialize();
public void addItem(String item);
public Collection getItems();
public void finished();
}

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.

@Stateful
public class ShoppingCartBean implements ShoppingCart {

private ArrayList items;

public void addItem(String item) {
items.add(item);
}

@Remove
public void finished() {
Iterator iter = items.iterator();
while(iter.hasNext()) {
System.out.println("Anda membeli " + iter.next());
}
items = null;
}

public Collection getItems() {
return items;
}

@PostConstruct
public void initialize() {
items = new ArrayList();
}

POJO hanya perlu implements POJI yang sudah dibuat sebelumnya. @Stateful memberitahu EJB container bahwa class tsb adalah stateful session bean. Ada satu annotation yang menarik di sana yaitu @Remove. Tidak seperti stateless session bean, satu stateful session bean melayani satu client. Jika dalam sekali waktu terdapat banyak client yang melakukan request, maka bisa dipastikan akan membebani server. Untuk itulah @Remove dibuat. Method yang mempunyai @Remove di atasnya, jika dipanggil maka akan mengakhiri stateful session bean. Jika kita tidak mendeklarasikan method yang memiliki @Remove atau tidak pernah memanggil method tersebut maka bean akan terus ada dan bergentayangan di memori. Untuk mengatasi hal ini, EJB memiliki cara tersendiri yang disebut activation/passivation.

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

@EJB
private static ShoppingCart shoppingCart;
public static void main(String[] args) {
shoppingCart.addItem("Item A");
shoppingCart.finished();
}


Bagaimana lifecycle stateful session bean? Stateful session bean memiliki 4 lifecycle, creation, destruction, passivation, dan activation yang kesemuanya ditangani EJB container. Lifecycle session bean dimulai ketika instance diciptakan saat client melakukan lookup ke bean tsb melalui JNDI atau dependency injection. Container akan membuat instance baru untuk masing-masing client. Satu cllient = satu bean instance. Jika client mengakhiri request dengan memanggil method ber-annotation @Remove, maka bean akan di-destroy. Namun bagaimana jika client tidak melakukan apa-apa dengan session beannya? Bean akan memenuhi dan memberatkan kinerja server. Untuk itu bean yang masih 'berkeliaran' dan 'sudah terlalu lama menganggur' akan di-passivate, yaitu bean akan dihapus dari memori dan diserialisasi ke disk untuk sementara. Jika bean tersebut diperlukan lagi maka akan di-activate atau deserialisasi lagi yaitu di-instantiate agar bisa digunakan lagi. Dan state yang telah ada sebelumnya disimpan akan dikembalikan. Namun jika bean yang sudah di-passivate tetap 'menganggur' untuk waktu yang telah ditentukan maka bean akan di-destroy.

Berkaitan dengan lifecycle bean tsb, ada empat callback method yang bisa dijalankan masing-masing pada saat setelah creation, sebelum destruction, sebelum passivation, dan setelah activation. Method tersebut bisa kita tentukan di dalam session bean dengan menggunakan annotation @PostConstruct, @PreDestroy, @PrePassivate, @PostActivate, masing-masing untuk creation, destruction, passivation, dan activation.

Dengan manajemen stateful session bean yang '1 client 1 instance', bisa dipastikan jika ada ribuan client yang mengakses bersamaan berpotensi menyebabkan sistem down. Untuk itu harus dilakukan perhitungan matang agar session bean digunakan hanya jika benar-benar dibutuhkan. Dan selalu deklarasikan @Remove dan pastikan agar setiap langkah akhir yang dilakukan client selalu memanggil method tersebut. Misalnya kita mempunyai 2 method remove, satu saat user menekan submit dan satu saat menekan cancel. Dan lakukan tuning pada EJB container untuk menentukan timeout yang tepat bagi aplikasi yang kita buat.

0 comments:

 

©2009 Stay the Same | by TNB