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.

Curriculum Vitae

Name : Rochmat Santoso
Birth : March 23, 1983
E-mail : rochmat.santoso@gmail.com

Formal Education :
1989-1995
Elementary School : SDN Pacarkembang III Surabaya

1995-1998
Junior High School : SLTP Negeri 9 Surabaya

1998-2001
Senior High School : SMU Negeri 1 Surabaya

2001-2008
University : Sepuluh Nopember Institute of Technology (ITS)
(Majoring in Informatics Engineering, Bachelor Degree)

Certification :
1. Sun Certified Java Programmer 1.4 (SCJP 1.4)
2. Introduction to Oracle 9i : SQL

Work Experiance :

June 2005 - February 2009
PT. Infoglobal Autoptima(IAO) : Java & .NET Programmer
Surabaya
http://www.infoglobal.co.id

March 2009 - June 2009
Freelance Programmer

June 2009 - Now
Software Engineer
PT. Mitrais
Sanur - Bali
http://www.mitrais.com

download my CV

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.

Sunday, March 29, 2009

Pooling

Beberapa bulan yang lalu saya sempat mempelajari Quartz. Quartz adalah scheduling framework yang sangat bagus di Java. Tidak hanya menyediakan timer yang bentuknya 'aneh-aneh' (saya bahkan tidak pernah berpikir akan ada aplikasi yang menggunakan scheduling yang macam-macam hehehe...), Quartz juga bisa diintegrasikan dengan EJB. Tapi ada satu konsep yang membuat saya tertarik saat mempelajari Quartz (walaupun sebenarnya konsep ini sudah lama ada, namun sebelumnya saya tidak begitu perhatian), yaitu pooling.

Apakah itu pooling? Menggunakan bahasa saya sendiri pooling berarti berbagi resource. Resource dalam hal ini adalah instance Java. Jadi pooling berarti berbagi instance yang ada. Bagaimanakah implementasinya? Saya sempat melihat source code pooling di Quartz (ini yang paling saya suka dari open source community) dan sempat mencoba sebuah thread pool sederhana untuk menampilkan tulisan biasa ke console.

Saya mempunyai sebuah class ThreadWorker yang bertugas menampilkan tulisan ke console, dan sebuah class ThreadPool sebagai pool manager

public class MyThreadWorker extends Thread {

private Runnable runnable;
private MyThreadPool pool;
...
public MyThreadWorker(MyThreadPool pool) {
this.pool = pool;
}

public void setRunnable(Runnable runnable) {
// mengeset object runnable
}

public void run() {
// menjalankan runnable.run() dan setelah tugasnya selesai maka
// thread worker ini dikembalikan ke pool dengan memanggil pool.makeAvailable(this);
}

}

public class MyThreadPool {

// list of thread worker
private List workers;
// thread worker yang ada di pool
private LinkedList availWorkers = new LinkedList();
// thread worker yang sedang menjalankan tugas dan tidak ada di pool
private LinkedList busyWorkers = new LinkedList();

public void initialize() throws Exception {
// initialize pool dengan membuat sejumlah object thread worker
// dan memasukkannya ke list workers dan available worker
}
public boolean runInThread(Runnable runnable) {
// mengambil thread worker dari available list, memasukkan thread
// worker ke busy worker list, kemudian menjalankan thread worker
}

public void makeAvailable(Runnable runnable) {
// mengembalikan thread worker yang sudah selesai
// menjalankan tugas ke dalam pool (available worker)
}
}

Begini cara memanggilnya

public static void main(String[] args) throws Exception {
MyThreadPool pool = new MyThreadPool();
pool.initialize();
pool.runInThread(new Runnable() {...});
...
}

Istilah 'container' yang membingungkan

Dalam dunia Java, sering sekali kita mendengar istilah container. Ada web container, Java EE container, dll. Tapi apakah container itu? Container secara sederhana dapat diartikan sebagai tempat tinggal komponen. Sedangkan komponen adalah kode-kode program yang reusable.

Sementara itu yang disebut web container adalah tempat tinggalnya komponen-komponen web seperti servlets, JSP, atau JSF. Contoh web container adalah Tomcat dan Jetty.

Kemudian ada yang disebut EJB container, yaitu tempat tinggalnya komponen-komponen EJB seperti session bean dan message-driven bean. EJB container biasanya tidak berdiri sendiri melainkan bersama-sama dengan web container, persistence provider, dan Java EE API lainnya membentuk sebuah Java EE container. Contoh Java EE container adalah Glassfish, BEA Weblogic Server, IBM Websphere, JBoss App Server, Oracle App server 10g.

EJB 3 Overview

Setelah lama bergelut dengan Spring, pingin juga rasanya berpaling ke framework lain untuk urusan J2EE. Dan kali ini pilihan jatuh pada EJB3. Sebelumnya saya belum pernah menggunakan EJB, baik EJB1 maupun EJB2 karena mendengar reviewnya yang cukup menyedihkan. Tapi untuk EJB3 ini orang bilang sudah banyak pengembangan dan perubahan yang dilakukan.

EJB adalah sebuah platform untuk membangun aplikasi yang portable, reusable, dan scalable menggunakan Java. Menggunakan EJB berarti kita tidak perlu repot memikirkan hal-hal seperti transaction, security, automated persistence dsb yang biasanya diperlukan untuk membangun sebuah aplikasi berskala besar. Pendek kata, developer hanya perlu fokus pada bisnis logic tanpa harus khawatir dengan infrastructure code.

Dari sudut pandang developer, EJB adalah Java code yang dieksekusi pada sebuah runtime environment yang disebut EJB container yang menyediakan banyak service seperti transaction, security, dll.

EJB sendiri terdiri dari beberapa komponen. Komponen-komponen ini akan dijalankan di EJB container, dan komponen lain yang ingin mengaksesnya hanya perlu tahu atribut apa saja yang perlu dikirimkan dan apa hasil yang diharapkan tanpa perlu tahu isi detil komponen tersebut. Ada tiga komponen dalam EJB yaitu session bean, message-driven bean, dan entity.

Banyak orang beranggapan bahwa membangun aplikasi web yang simple menggunakan EJB terlalu lebay. Anggapan ini tidak sepenuhnya benar. Sebagai analogi, saat kita membangun rumah, kita tidak membuat semuanya mulai awal bukan? Melainkan kita membeli material atau menyewa kontraktor. Hal ini berlaku juga dalam membangun software. Kebanyakan aplikasi server-side memiliki kesamaan seperti adanya bisnis logic, manajemen application state, query database, manajemen transaction, security, adanya asynchronous process, system integration, dll. EJB container menyediakan itu semua. Ini berarti kita bisa membangun aplikasi lebih cepat daripada yang kita bayangkan.

Dua hal utama yang membuat EJB3 diakui banyak orang sebagai improvement adalah penggunaan annotation dan dependency injection serta pemisahan persistence API sebagai standard sediri. Annotation dan dependency injection sendiri sebenarnya juga sudah digunakan banyak framework sejak kemunculannya di Java 1.5. Dengan dependency injection kita tidak perlu melakukan lookup resource dan bagi yang tidak begitu suka dengan xml deployment descriptor bisa meminimalkan penggunaan xml. Dan pemisahan persistence API sebagai standard sendiri adalah untuk mengakomodasi kebutuhan interaksi aplikasi dengan database walaupun aplikasi yang dibangun tersebut tidak membutuhkan banyak service dari EJB container, misalnya aplikasi yang dibangun dengan J2SE yang memerlukan akses ke database.

Friday, March 13, 2009

Gagal connect ke Oracle XE

Hari ini ada kejadian menyebalkan dengan Oracle. Setelah beberapa lama tidak ada masalah dengan connect dari dbVisualizer, hari ini sekonyong - konyong tidak bisa connect ... dan tidak bisa mengakses database homepage. Setelah gugling sana sini akhirnya dapat kesimpulan bahwa listenernya belum jalan karena saat configure oracle saya memilih opsi untuk tidak menjalankan oracle saat Ubuntu startup.

Trus gimana caranya menjalankan oracle listener di ubuntu? Saya menambahkan baris export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server pada file /etc/profile. Setelah itu jangan lupa logout. Untuk start listener saya gunakan user oracle (cari user ini di System->Administration->User and Group dan ubah passwordnya jika tidak tahu). Masuk ke terminal sebagai user oracle dengan perintah su - oracle -p. Selanjutnya masuk ke folder /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin dan ketik ./lsnrctl untuk masuk command lsnrctl. Untuk menjalankan listenernya ketik start. Coba apakah sukses atau gagal dengan masuk ke browser http://localhost:8080/apex (memang agak lama startupnya) atau connect lagi dengan dbVisualizer.

Monday, March 9, 2009

Oracle XE di Hardy Heron

Pertanyaan pertama kalo migrasi ke OS baru adalah 'Ada gak sih aplikasi yang serupa dengan aplikasi ini di OS ini?' atau 'Caranya nginstall aplikasi ini di OS ini gimana?' Itu pula yang saya alami dengan Oracle. Emang ada Oracle yang bisa diinstall di Ubuntu? Kan Oracle gak gratis... Kalo ada cara nginstallnya gimana?

Pas melontarkan pertanyaan itu di forum malah disarankan pake Postgre atau MySQL...dieng... Yang saya mau itu kan Oracle, bukan yang lain. Setelah googling, akhirnya nemu juga caranya berurusan sama Oracle di Ubuntu. Oracle memang bukan aplikasi gratisan. Tapi oracle merilis Oracle 10g eXpress Edition (XE) sebagai versi gratisan Oracle 10g. Untuk menginstall Oracle 10g XE lakukan langkah-langkah berikut...

Pertama, tambahkan "deb http://oss.oracle.com/debian unstable main non-free" di /etc/apt/sources.list untuk menambah repository oracle ke Ubuntu.
Kedua, import GPG key "wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add - " agar package dari Oracle muncul di add/remove dan synaptic.
Ketiga, jangan lupa update Ubuntunya "sudo apt-get update".
Keempat, pilih oracle-xe-universal dari synaptic untuk menginstall.
Setelah selesai install jangan lupa lakukan konfigurasi dengan menjalankan "sudo /etc/init.d/oracle-xe configure" dari terminal.

Setelah sukses install dan login ke database, pertanyaan saya selanjutnya adalah "Gimana caranya berinteraksi dengan oracle XE ini?" Kalo di Windows saya biasanya pake Toad atau Tora. Setelah cek di add/remove ternyata ada juga Tora untuk Ubuntu. Setelah install Tora...tada... Oracle tidak ada pada daftar database yang disupport...!@#$%^&*(Kok bisa ya...bukannya Tora singkatan dari Tool for Oracle... Kok malah yang nongol di situ Postgre SQL yang barusan juga saya install...).

Install tora ternyata perlu mengkompile ulang sourcenya dengan perubahan minor agar mendukung Oracle. Namun setelah sukses mengkompile, Oracle tidak juga disupport si Tora ini. Bahkan setelah beberapa versi Tora saya coba, hasilnya nihil. Setelah googling, ada yang menyarankan pake dbvisualizer. Dbvisualizer ini berbasis java jadi install dulu JRE.

Dbvisualizer berbentuk rpm bisa didonlut di http://www.minq.se/products/dbvis/download/install.jsp. Agar bisa diinstall di Ubuntu ubah ke bentuk deb dengan cara "sudo alien dbvis_linux_6_5_4.rpm". Selanjutnya install dengan mendobel klik file .deb tsb. Di Hardy saya, dbvisualizer disimpan di direktori /opt/DbVisualizer-6.5.4. Untuk menjalankannya ketik ./dbvis di terminal.

Untuk connect dari dbvisualizer ini dibutuhkan jdbc driver. Saya pake ojdbc14-10.2.0.1.0.jar dengan Database URL "jdbc:oracle:thin:@localhost:1521:XE"

Hardy Heron

Ubuntu adalah sistem operasi kedua yang pernah saya install sendiri setelah keluarga Windows. Pertama kali kenal Ubuntu dari teman yang kantornya pake OS ini. Ubuntu yang tetap saya pake sampai sekarang adalah Hardy Heron. Kenapa? Karena Long Term Support (LTS) nya, artinya akan tetap ada update support untuk si Hardy ini selama 3 tahun. Mungkin nanti bakal upgrade lagi kalo dirilis Ubuntu LTS lain. Untuk sekarang Hardy Heron lebih dari cukup.

Awal install Hardy ini dulu pake Wubi, jadi Ubuntu dinstall sebagai program biasa di Windows, tidak perlu partisi, kalo mau hapus Ubuntunya tinggal remove Wubi dari control panel. Tapi dengan pake Wubi jadi tidak maksimal. Yang pernah saya alami adalah bermasalah dengan VGA yang selalu slow motion. Setelah install Ubuntu secara native OS, dual boot dengan XP, Alhamdulillah belum pernah ada masalah. Tapi sampai sekarang belum pernah nyobain animasi-animasi macam compiz di Ubuntu, yang penting membiasakan diri dulu melakukan pekerjaan sehari-hari pake Ubuntu walaupun masih belum bisa 100%. Yang paling tidak mungkin meninggalkan Windows adalah karena masih seringnya mendapat dokumen berupa .doc maupun .xls yang kalo dibuka pake OpenOffice hasilnya hancur berantakan dan tentu saja games di Windows yang keren-keren hehehe...

First Entry

Wah ternyata masih bisa login ke blog ini setelah 6 bulan tidak login sama sekali :D. Ini adalah posting pertama di blog ini. Blog ini awalnya dibuat karena menjawab pertanyaan penguji Tugas Akhir. Waktu itu ditanya 'Usaha apa yang akan Anda lakukan agar hasil Tugas Akhir Anda diketahui banyak orang'...deng dong... Spontan yang terlintas di pikiran adalah publikasi lewat blog. Maka lahirlah blog ini yang tidak pernah diupdate sampai 6 bulan kemudian hohohoho... Yah moga-moga habis ini jadi rajin ngeblog...
 

©2009 Stay the Same | by TNB