Archive

Archive for May, 2008

Poison message di Message Driven Bean

May 7th, 2008

Sebenarnya solusinya agak sedikit kurang bagus sih untuk mengatasi masalah poison message di MDB ini, tapi bagaimana lagi….. Poison message itu sebenarnya message yang diterima oleh MDB dari JMS sedemikian rupa sehingga waktu diolah di MDB-nya membuat error di bisnis logic. Sehingga exception dilempar dan diketahui oleh container EJB, kemudian melakukan proses rollback transaction. Rollback transaction akan diikuti proses redelivery message oleh JMS ke recipent, dalam hal ini MDB itu sendiri. Jika itu berlanjut, maka otomatis proses akan berulang-ulang tanpa henti. Ini bisa menghabiskan load di server.

Nah, berhubung penulis masih belajar :D , maka salah satu solusinya (sesuai dengan yang dibuku sih) adalah dengan memberi penanda khusus untuk tiap message ID. Jadi jika proses sudah berulang kali dilakukan dengan message ID yang sama, maka jika sudah melebihi batas redelivery message count-nya, message akan di discard dan tidak masuk dalam bisnis logic. Dengan begitu MDB akan berjalan aman, gak akan terjadi pengulangan proses dengan message ID yang sama.

Tapi sebenarnya yang mengganjal itu adalah proses catch exception yang dikeluarkan oleh JDBC (pake JPA). Karena memang tidak tertangkap baik di sisi MDB-nya. Jadinya akal-akalan dengan melihat contoh kasus di forum, yang menggunakan entity manager untuk menyimpan ke DB; dengan cara setelah memanggil command persist, harus diikuti oleh command flush. Dengan begitu exception yang dikeluarkan di bisnis logic (khususnya di JPA-nya) dapat di catch. Meskipun penulis pikir yang ke catch itu EJBException-nya, soalnya sebelumnya dilihat di log, proses berulang-ulang itu akan throw 2 exception, satu adalah toplink JDBCnya dan EJBException sendiri (ini kayaknya bagian containernya).

Saat ini udah kehandle pake cara tadi itu, cuman ya itu tadi; belum ketemu untuk nge-catch Database Exceptionnya…. yah … sambil jalan aja lah…..

admin General

Clustering di Glassfish v2

May 5th, 2008

Mengambil dari sini. Soalnya caranya lebih bisa dimengerti. Intinya bikin domain dulu (default domain1). Setelah itu baru bikin node agent yang konek ke domain tersebut. Dari situ tinggal buat instance di masing-masing node-agent. Sebelumnya domain1 harus terkonfigurasi jadi cluster. Berikut langkah-langkahnya; asumsinya punya 2 mesin yang dibuat cluster.

  1. Ekstrak glassfish.jar di masing-masing host. (misal host A dan B)
  2. Setup menggunakan konfigurasi cluster di dua2nya. (ant -f setup-cluster.xml)
  3. Apabila DAS di taruh di host A, maka jalankan domainnya (asadmin start-domain)
  4. Setelah itu baru buat node agent di masing-masing host yang mengarah ke domain yang kita buat ((host A)asadmin create-node-agent –host A agent-A. (host B)asadmin create-node-agent –host A agent-B)
  5. Jalankan node agent ((host A)asadmin start-node-agent agent-A. (host B)asadmin start-node-agent agent-B)
  6. Buat cluster di domain1. (asadmin create-cluster ABcluster)
  7. Bikin instance di masing-masing node-agent dibawah cluster ABcluster ((host A)asadmin create-instance –cluster ABcluster –nodeagents agent-A –host A instance-A. (host B) asadmin create-instance –cluster ABcluster –nodeagents agent-B –host A instance-B)
  8. Setelah selesai tinggal start cluster ABcluster (asadmin start-cluster ABcluster)
  9. Udah deh… jalan…

Clustering udah jalan, sekarang tinggal mainan load balancer-nya. Nah dari penjelasan di website-nya sun, bilang kalau ada beberapa cara buat load balancer webnya. Salah satunya yang paling mudah pakai apache. Kebutuhannya adalah

  • Web server apache. Disini penulis pake yang versi 2.2.4.
  • Modul mod_jk buat koneksi ke glassfish. Modul ini terkoneksi menggunakan standar ajp, biasa untuk mengkoneksikan apache dengan backend tomcat. Penulis pake versi mod_jk-1.2.26-httpd-2.2.6.so. Sebenarnya ada lagi modul yang pake protokol ajp ini, mod_proxyajp kalo gak salah, cuman yang memang lagi aktif ya mod_jk ini.
  • Library jar tomcat-ajp.jar , common-logging.jar, commons-modeler.jar buat ditaruh di glassfish.

Langkah-langkahnya :

  1. Masukkan modul mod_jk ke konfigurasi apache.
  2. Tambahkan konfigurasi di apachenya sbb:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <IfModule mod_jk.c>
    # Tells the module the location of the workers.properties file
    JkWorkersFile /etc/apache2/mods-available/workers.properties
    # Specifies the location for this module's specific log file
    JkLogFile /var/log/mod_jk.log
    JkShmFile /var/log/jk-runtime-status
    # Sets the module's log level to info
    JkLogLevel info
    # Sets the module's log time stamp format
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    # JkOptions for SSL
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
    </IfModule>
  3. Buat file workers.properties di lokasi yang tunjuk dari konfigurasi sebelumnya. Disini penulis pake dua host A (192.168.1.133) dan host B (192.168.1.220).
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    worker.list=loadbalancer
    worker.worker1.type=ajp13
    worker.worker1.host=192.168.1.133
    worker.worker1.port=8009
    worker.worker1.lbfactor=1
    worker.worker1.socket_keepalive=1
    worker.worker1.socket_timeout=300
    worker.worker2.type=ajp13
    worker.worker2.host=192.168.1.220
    worker.worker2.port=8009
    worker.worker2.lbfactor=1
    worker.worker2.socket_keepalive=1
    worker.worker2.socket_timeout=300
    worker.loadbalancer.type=lb
    worker.loadbalancer.balance_workers=worker1,worker2
  4. Tambahkan mount point untuk direktori tertentu mengarah ke worker mod_jk (mis. JkMount /* loadbalancer). Dari contoh tersebut semua URL yang berawalan / akan mengarah ke worker milik mod_jk.
  5. Masukkan file-file jar ke direktori library milik glassfish (mis. /opt/glassfish/lib). Tambahkan parameter -Dcom.sun.enterprise.web.connector.enableJK=8009 di JVM Option (config cluster).
  6. Restart apache dan glassfish.

admin Server