JBoss-seam double datasource
Suatu hari anak muda mendapat tugas membuat sopwer yang menggunakan dua database. Yang satu menggunakan MySQL dan satu lagi Oracle. Sang anak muda sudah terbiasa menggunakan seam-framework dan akan menggunakan seam juga untuk membuat program yang ditugaskan.
Datasource yang pertama digunakan untuk main data transaction (smsgw), sedangkan datasource yang kedua digunakan sekedar baca (mbmcDatasource). Berikut adalah langkah2 yang dilakukan oleh anak muda dalam menggunakan dua datasource di seam-projectnya:
- Definisikan datasource di *-ds.xml
<local-tx-datasource>
<jndi-name>smsgwDatasource</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/smsgw</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>smsgw</user-name>
<password>rahasia</password>
</local-tx-datasource><no-tx-datasource>
<jndi-name>mbmcDatasource</jndi-name>
<connection-url>jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:ORACLESID</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>root</user-name>
<password>rahasia</password>
</no-tx-datasource> - Definisikan entity manager di component.xml
<persistence:managed-persistence-context name=”entityManager”
auto-create=”true”
entity-manager-factory=”#{smsgwEntityManagerFactory}”/>
<persistence:entity-manager-factory name=”smsgwEntityManagerFactory”
persistence-unit-name=”smsgw”/>
<persistence:managed-persistence-context name=”mbmcEntityManager”
auto-create=”true”
entity-manager-factory=”#{mbmcEntityManagerFactory}”/>
<persistence:entity-manager-factory name=”mbmcEntityManagerFactory”
persistence-unit-name=”mbmc”/> - Definisikan jndi datasource nya di persistence-*.xml
<persistence-unit name=”smsgw” transaction-type=”JTA”>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/smsgwDatasource</jta-data-source>
<properties>
<property name=”hibernate.dialect” value=”org.hibernate.dialect.MySQLDialect”/>
<!– property name=”hibernate.hbm2ddl.auto” value=”update”/–>
<property name=”hibernate.show_sql” value=”true”/>
<property name=”hibernate.format_sql” value=”true”/>
<property name=”hibernate.transaction.manager_lookup_class” value=”org.hibernate.transaction.JBossTransactionManagerLookup”/>
<property name=”hibernate.connection.release_mode” value=”after_transaction”/>
</properties>
</persistence-unit><persistence-unit name=”mbmc” transaction-type=”RESOURCE_LOCAL”>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/mbmcDatasource</non-jta-data-source>
<properties>
<property name=”hibernate.dialect” value=”org.hibernate.dialect.Oracle10gDialect”/>
<property name=”hibernate.show_sql” value=”true”/>
<property name=”hibernate.format_sql” value=”true”/>
<property name=”jboss.entity.manager.factory.jndi.name” value=”java:/mbmcEntityManagerFactory”/>
<property name=”hibernate.connection.release_mode” value=”after_transaction”/>
</properties>
</persistence-unit>
4. Untuk menggunakan masing-masing entityManager, sang anak muda cukup menggunakan anotasi lookup @In yang dimiliki oleh seamframework.
—SomeWhere.java–
@In
private EntityManager entityManager;
@In
private EntityManager mbmcEntityManager;
Seingat anak muda itulah step2 yang dilakukannya. Semoga bermanfaat. Salam.
Override HTTP to HTTPS and Close HTTP TRACE
Override HTTP to HTTPS:
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Close HTTP TRACE:
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
RewriteCond %{REQUEST_METHOD} ^TRACK
RewriteRule .* - [F]
Bikin sekrip untuk inspek sistem
Kali ini ane mau bikin sekrip untuk mengetahui kondisi load memori, CPU dan IO disk di sistem linux. Kebetulan ane dapet tugas meneliti kondisi serper di client. Kali2 aje dikemudian hari berguna, begini sekripnye:
1. Sekrip untuk ngetahuin load CPU dan memori di linux Box. Sekrip ini cuma ngeliat top proses yang makan paling banyak (kagak semua).
#!/bin/bash
LOG_FILE="/home/hameed/Documents/WORK/CAT/script/topLog.txt"
echo "===================="`date +"%d-%m-%y"`"===================" >> $LOG_FILE
/usr/bin/top -n 1 -b | head -n20 >> $LOG_FILE
echo "=============================================" >> $LOG_FILE
echo "" >> $LOG_FILE
2. Sekrip buat ngetahuin load IO disk. Khusus buat sekrip yang eni, die make tools tambahan..namenye iostat.
#!/bin/bash
LOG_FILE="/home/hameed/Documents/WORK/CAT/script/iostatLog.txt"
INTERVAL=15
iostat -xtd $INTERVAL >> $LOG_FILE
Sekrip-sekrip ini masih culun dan sederhana banget. Ntar2 klo ade keperluan lebih, ane update tulisannye ye. Kurang lebih ane minta maaf, Wabillahi Taufik Wal Hidayat, Wassaalamu’alaikum.Wr.Wb.
Ragam JAVA_OPTS untuk optimasi
Berikut ini opsi-opsi JAVA_OPTS yang bisa digunakan untuk optimasi memori yang digunakan oleh JVM.
-Xms, mengatur besar inisialisai heap memori-Xms, mengatur maximum heap memori-XX:MaxPermSize, mengatur besaran heap space yang tidak akan kena gargage collector (GC)-XX:+UseParallelGC, secara default JVM menggunakan GC dalam satu thread, namun dengan opsi ini GC bisa dijalankan dalam beberapa thread.-XX:+AggressiveHeap, lebih optimal untuk long-running dan alokasi memori yang lumayan sering.
Sekian..semoga bermanfaat
Remote debugging di Eclipse
Bismillahirrahmaanirrahiim…
Udah lama tak terasa sekian tahun blog ini tak kukunjungi (haha, gaya kali kau meed). Kali ini aku ingin menuliskan tentang cara konfigurasi remote debugging di Eclipse. Biar gak lupa..ku tuliskan saja disini, maklumlah boi aku ini agak2 payah dalam hal ingat-mengingat.
1. Tambahkan baris berikut di bagian parameter run-script dari aplikasi yang akan di debug:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=[PORT_NUMBER]
Sebagai contoh, yang akan didebug adalah aplikasi yang berjalan di JBoss (localhost). Maka di run-script JBoss nya kita tambahkan parameter diatas.


Sebagai contoh, nomor port yang akan digunakan oleh java agent sebagai “pintu masuk” debug adalah 9998. Nambahin parameternya tidak mutlak dari UI JBoss configuration yg ada di eclipse, ini cuma contoh saja. Dalam penerapan nanti bisa saja parameter di atas di tambahkan di dalam run.sh/run.bat ataupun run script bikinan sendiri.
2. Buat konfigurasi debug baru. Pillih menu Run->Debug configuration..lalu akan muncul form “Debug Configuration”.

Double click menu “Remote Java Application”, nanti akan ada form new debug configuration. Di bagian port, sila definisikan port mana si agent debug akan connect, di source project mana konfigurasi ini akan bekerja. Dari screenshot di atas, debug agent akan connect ke port 9998. Host bisa saja berupa komputer lain, namun pada contoh ini aplikasi yang akan didebug adalah di localhost.
Konfigurasi remote debugging sudah selesai. Kita bisa jalankan aplikasi yang akan didebug. Pastikan tidak ada firewall yang memblok port yang digunakan. Untuk melakukan debugging, pilih menu gambar kutu yang ada di toolbar eclipse, lalu pilih nama dari debug configuration yang telah didefinisikan pada point 2. Atau bisa melalui menu Run->Debug Configuration->Remote Java Application->[NAMA DEBUG CONFIGURATION]->debug.
Selesai – Semoga bermanfaat
Membaca event dari keypress
Halo blog, udah lama kita ga ketemu. Kali ini aku mau menuliskan sedikit tentang nyanyian kode. Ini tentang membaca event dari keyboard, yang dipasang komponent.
function readKey(e) {
var key;
if(window.event)
key = window.event.keyCode; //IE
else
key = e.which; //Firefox
if(key == 13)
alert('enter boi');
else
alert('bukan enter');
}
<h:inputText value="#{bean.value}" onkeypress="readKey(event); return false;">
Semoga bermanfaat – salam;
Sampah kalian !!!
Pagi ini aku membaca sebuah tulisan di salah satu situs news, judulnya “Kenaikan Gaji Korbankan Anggaran Gizi Buruk”. Isinya tentang kenaikan gaji di DepKeu, MA dan BPK. Sontak emosi ku naek..naek sekali..setinggi puncak Jayawijaya.
Sesuai titlenya, yang dikorbankan adalah anggaran gizi buruk. Woi hebat kali kalian ya, sudah enak-enak di “lahan basah”, kerja pun tak kunjung becus..sekarang kalian mengambil jatah rakyat miskin, rakyat jelata, anak-anak yang menderita busung lapar. Bukannya ber-terima kasih kepada rakyat dengan bekerja sebaik-baiknya, eh ini malah minta kenaikan gaji pulak!!. Masih kurang apa uang rakyat yang kalian makan selama ini??!!. Masih kurang “buncit” kah perut kalian tu woi?!!.
Semakin sedih Ibu pertiwi, menangis para pejoeang negara ini. Semakin hilang empati rakyat kecil kepada kalian. Hanya ada satu kata untuk kalian…SAMPAH!!!
Mencari semangat
Pagi ini ku coba mencari semangat, berbagai site di internet ku kunjungi…namun semangat itu tak kunjung ku temui. Teringat aku akan tim-ku dulu yang penuh semangat dan full dengan energi tak terbatas, the greatest team..OpenCAMS. Kami punya mars yang bikin semangat, yang kami ambil dari Mars Slanker. Salah seorang saudaraku pernah menuliskan mars tersebut didalam blognya, aku pun meluncur kesana.
Disini tempat cari senang
salah tempat kalau kau cari uang
disini orang-orang penuh kreatifitas
tempat orang-orang yang survive.
Disini bukan anak-anak malas
tempatnya para pekerja keras
disini bukan anak-anak manja
sedikit kerja banyak mintanya.
Bali, siap bekerja keras!!!
Kerja..kerja..ayo kita kerja !!!
Nah..kembali lagi semangatku pagi ini, trims sodaraku.
Konfirmasi dialog popup di richfaces
Kali ini saya mendapat tugas membuat konfirmasi dialog popup, yang menampilkan message tertentu..seperti “Are you sure..?” dilengkapi dengan tombol “Yes” atau “No”. Kebetulan teknologi web komponen yang dipakai kali ini adalah richfaces. Agar reusable, saya buat konfirmasi dialog popup tersebut sebagai komponen. Untuk itu dipakek lah teknologi facelets yang bisa bisa mendefine komponen dengan mudah. Dan kebetulan lagi, richfaces dan facelets tersebut sudah ada dan terkonfigurasi dalam JBoss Seam Framework, framework yang sedang saya gunakan sekarang. Untuk instalasi dan konfigurasi richfaces dan facelets, silahkan merujuk ke situs offi-sial-nya.
Langsung saja ke code nya y, daripada berpanjang lebar g jelas (talk is cheap, show me the code, Linus – 2000).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:component xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<a4j:jsFunction name="#{submitName}" action="#{resolver.resolveMethodExpression(actionBean)}" reRender="#{listName}"/>
<rich:modalPanel id="#{modalPanelId}" width="250" height="150">
<f:facet name="header">#{messages['common.Confirmation']}</f:facet>
<h:panelGrid>
<h:panelGrid columns="2">
<h:graphicImage value="/img/msginfo.png" />
<h:outputText value="#{textMessage}" style="FONT-SIZE: large;" />
</h:panelGrid>
<h:panelGroup>
<rich:spacer height="20px" />
<input type="button"
value="OK"
onclick="#{rich:component(modalPanelId)}.hide();#{rich:component('wait')}.show();
#{submitName}();return false;" />
<input type="button" value="Cancel" onclick="#{rich:component(modalPanelId)}.hide();return false" />
</h:panelGroup>
</h:panelGrid>
</rich:modalPanel>
</ui:component>
Resolver. Resolver ini berfungsi me-resolve ekspresi EL berupa action atau method dari backing bean yang dijadikan parameter. Langkah berikutnya adalah membuat bean resolver tersebut. Berikut kodenya:
/* Resolver.java */
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.Expressions;
import org.jboss.seam.core.Expressions.MethodExpression;
@Name("resolver")
@Scope(ScopeType.APPLICATION)
public class Resolver {
public Object resolveMethodExpression(String elStr) {
MethodExpression resolvedEl = Expressions.instance().createMethodExpression("#{" + elStr + "}");
if (resolvedEl != null) {
resolvedEl.invoke();
}
return resolvedEl;
}
}
Resolver mempunyai scope “application” karena bean ini akan digunakan berulang kali selama konfirmasi popup dialog digunakan. Sebagai catatan, Resolver diatas spesifik ke seam, karena menggunakan method yang dimiliki oleh seam.
web.xml.
<!--- confirmation-taglib.xml --->
<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://urangbiase.wordpress.com/ui</namespace>
<tag>
<tag-name>confirm</tag-name>
<source>confirmation.xhtml</source>
</tag>
</facelet-taglib>
<!--- web.xml --->
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/confirmation-taglib.xml</param-value>
</context-param>
Selesai sudah komponen konfirmasi popup dialog yang kita buat. Berikutnya adalah implementasi dari komponen yang telah kita buat.
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
-------------cutted text-----------8<
xmlns:urang="http://urangbiase.wordpress.com/ui">
-------------cutted text-----------8<
<a4j:form>
<urang:confirm actionBean="transportationList.removeSelected()" modalPanelId="removeSelectedTransportation"
listName="transportationList" textMessage="Are you sure remove selected row?"
submitName="submitRemoveSelectedTransportation"/>
-------------cutted text-----------8<
<a4j:commandLink id="comLinkRemoveSelected">
<h:graphicImage value="/img/trash.gif" />
</a4j:commandLink>
<rich:componentControl attachTo="comLinkRemoveSelected"
for="#{removeSelectedConfirmation}"
event="onclick"
operation="show"/>
<rich:toolTip value="#{messages['common.RemoveSelected']}" for="comLinkRemoveSelected2"/>
</a4j:form>
</ui:composition>
Dan inilah hasil tangkapan layar dari konfirmasi dialog popup.

Demikianlah, semoga bermanfaat. Kritik, saran dan THR amat dinantikan
.
PS: tulisan ini dibuat ketika belum dapat kucuran THR.
Klausa equals String
Untuk membandingkan dua String, biasa nya saya menggunakan cara ini:
String str = "SangPemimpi";
if (str.equals("SangPemimpi")) {
// do something
}
Cara itu sudah benar, namun ada best-practicenya:
if ("SangPemimpi".equals(str)) {
// do something
}
Dimana letak perbedaanya? Cara yang pertama sangat riskan, bisa terkena NPE (NullPointerException) jika variabel str bernilai null. Sedangkan cara kedua, meskipun str bernilai null tidak akan terjadi NPE.
Sekian, semoga bermanfaat
Recent Comments