Saturday, December 14, 2013

Sentralisasi Hibernate Cache dengan Terracotta/Ehcache

ORM cache diperlukan untuk mengurangi akses ke database, yaitu untuk pengaksesan data yang sama berulang kali.

Defaultnya, hibernate telah menerapkan caching pada level Session (L1). artinya, cache tersebut hanya digunakan oleh 1 user, dalam 1 proses transaksi. Bagaimana untuk menerapkan caching untuk multi-user (multi-session)?

Untuk kasus demikian, perlu diterapkan caching pada level SessionFactory (L2). 1 aplikasi memiliki 1 SessionFactory yang menghandle setiap Session pada aplikasi.

Kemudian dalam pengembangannya, untuk penerapan aplikasi enterprise, tidak menutup kemungkinan adanya 'kerja sama' antar aplikasi untuk mengolah suatu proses bersama. dan tidak menutup kemungkinan pula adanya share data yang sama. Pertanyaan berikutnya, bagaimana cara untuk menerapkan cache untuk multi-aplikasi?

Untuk kasus demikian, kita bisa membuat suatu sentralisasi cache di mesin tertentu. Cache ini bisa berupa memcache (data tersimpan di memory) atau disk cache (data tersimpan di disk).

Pada penerapan memcache, dibutuhkan RAM yang besar karena data tersimpan di RAM. karena disimpan di RAM, jika mesin mati, maka cache akan hilang. Sedangkan pada penerapan disk cache, dibutuhkan harddisk yang besar karena data tersimpan di harddisk dan keuntungannya adalah cache akan tetap tersimpan jika mesin mati.

Sebagai bahan perbandingan, bisa baca juga artikel ini http://surniaulula.com/2012/12/04/memcached-vs-disk-cache/.

Sentralisasi cache ini konsepnya adalah meletakkan cache di mesin/alamat tertentu, dan tiap aplikasi yang ingin menggunakannya bisa mengeset L2 cachenya ke alamat tersebut. Dengan demikian, tiap aplikasi akan menggunakan cache yang sama dan konsistensi data tetap terjaga.

Yang akan kita gunakan di sini adalah penggunaan disk cache dengan terracotta bigmemory.

PRE-REQUISITES:
- bigmemory-max-4.0.2 distribution

LIBRARIES:
- maven repository: terracotta-releases http://www.terracotta.org/download/reflector/releases
- org.hibernate.hibernate-core-4.1.12.Final
- org.hibernate.hibernate-ehcache-4.1.12.Final - exclusion: net.sf.ehcache.ehcache-core
- net.sf.ehcacheehcache-ee-2.7.0
- org.hibernate.javax.persistence.hibernate-jpa-2.0-api-1.0.1.Final
- org.slf4j.slf4j-jdk14-1.6.6
- org.terracotta.bigmemory-4.0.2
- org.terracotta.terracotta-toolkit-runtime-ee-4.0.2

DOWNLOADS:
- http://terracotta.org/downloads/bigmemorymax/free

STEP BY STEP CONFIGURATION
SERVER SIDE:
1. download bigmemorymax, mesti download sendiri karena di situ ada license key
2. terracotta-license.key (yg didapat dari email dari terracotta) diletakkan di BigMemory Max Free home directory
3. taruh bigmemory-max home directory ke server
4. edit bigmemory-max-4.0.2/server/tc-config.xml, host disesuaikan dengan ip server
5. utk menyalakan: bigmemory-max-4.0.2/server/bin/start-tc-server.sh (unix) atau start-tc-server.bat (win)

CLIENT SIDE CONFIGURATION
1. set repository dan dependency tiap aplikasi
2. set di hibernate config:
 <property name="hibernate.cache.use_second_level_cache">true</property>  
 <property name="hibernate.cache.use_query_cache">true</property>  
 <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</property>  
 <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>  
 <property name="hibernate.generate_statistics">true</property>  
 <property name="hibernate.cache.use_structured_entries">true</property>  
 <property name="net.sf.ehcache.configurationResourceName">${ehcache-config-location}</property>  

3. set di ehcache config:
 <!-- default -->  
 <defaultCache maxElementsInMemory="0" eternal="false" statistics="true">  
   <cacheEventListenerFactory class="net.sf.ehcache.event.TerracottaCacheEventReplicationFactory" />  
   <terracotta clustered="true" />  
 </defaultCache>  
 <!-- cache per entity -->  
 <cache name="com.nostra.entity.Class" eternal="false" statistics="true" >  
   <cacheEventListenerFactory class="net.sf.ehcache.event.TerracottaCacheEventReplicationFactory" />  
   <terracotta consistency="eventual" />  
 </cache>  
 <!-- server address: disesuaikan dengan tc-config.xml di server -->  
 <terracottaConfig url="ip-server:port" />  

SOURCE CODE IMPLEMENTATION
1. tambahkan annotation @Cache dan concurrency strategynya pada entity yang akan dicache.

REFERENCES:
- http://ehcache.org/documentation/2.5/integrations/hibernate
- http://terracotta.org/documentation/4.0/bigmemorymax/get-started

Monday, December 9, 2013

Webcenter Portal (Spaces) and Oracle BPM Integration - Part 2


Blog ini melanjutkan Webcenter Portal (Spaces) and Oracle BPM Integration - Part 1. Sekilas review, blog ini akan menjelaskan bagaimana caranya mengintegrasikan workspace yang ada di Oracle BPM ke dalam Webcenter Portal. Hal ini diperlukan apabila anda mengimplementasi Portal dan BPM bersamaan, tapi ingin BPM diakses melalui Portal. Sebelum membaca blog ini, silahkan terlebih dahulu membaca Part1-nya agar dapat lebih memahami langkah-langkah yang dilakukan dari awal :)

Prerequisite:


  • Webcenter Portal, Oracle BPM dan Webcenter Content sudah terinistall (tutorial ini menggunakan versi 11.1.1.7 untuk ketiga sistem)
  • Basic knowledge untuk navigasi ke folder-folder instalasi masing-masing komponen diatas :)
  • Membaca dan mengeksekusi Webcenter Portal (Spaces) and Oracle BPM Integration - Part 1

Langsung saja kita lanjutkan.

1. Masuk ke folder oracle_common/common/bin dan jalankan ./config.sh

2. Configuration Wizard terbuka. Pilih 'Extend my domain using an existing extension template'. Pilih template bpm yang ada di folder /templates/applications/oracle.bpm.spaces_template_11.1.1.jar. Ini akan meng-extend dan meng-include jar yang diperlukan oleh Webcenter Spaces anda untuk menjalankan workspace BPM. Lokasi template biasanya ada di: ~/Oracle_WC1/common/templates/applications/oracle.bpm.spaces_template_11.1.1.jar

3. Layar configuration summary akan terbuka, pilih Extend untuk meng-extend domain anda.
4. Progress screen tentunya :)
5. Copy folder berikut:
~/Oracle/Middleware/Oracle_SOA1/bpm/process_spaces/
ke ~/Oracle/Middleware/process_spaces. Edit file process-portal-install.properties. Berikut adalah contoh untuk environment yang saya gunakan. Anda dapat sesuaikan berdasarkan environment anda (Cluster, Database Name dsb). Pastikan property extendSoa = false.
################################################
# BPM Process Portal installation properties   #
################################################

#  Flag to decide whether to extend existing BPM domain or create a new one.
#  Set extendSoa to true, if the webcenter space and the SOA server are running in the same domain  
#  Set extendSoa to false, if the webcenter space and the SOA server are running in different domains
extendSoa=false

#  Flag to decide whether install will prompt for passwords or read them from this file
promptForPasswords=false

#
#  Setting up domain global trust
#  Provide information to set up trusted domains between the webcenter domain and the SOA domain
#
#  Flag to control whether to set domain realm password or not, set to true if extendSoa is false
wcSetDomainRealmPassword=true
#  This is the password to setup trusted domains. Same password should be set on BPM domain as well
wcDomainRealmPassword= password
wc.server.port=8888

#
#  Information of SOA server to which webcenter space is connected.
#

#  BPM Schema and MDS details
#  Provide the SOA MDS database and schema details here
bpmDBUser=DEV_SOAINFRA
bpmDBPassword= password
bpmDBType=ORACLE
bpmDBDriver=oracle.jdbc.OracleDriver
bpmDBUrl=jdbc:oracle:thin:@ORACLEDB:1521:ORCL


bpmMDSUser=DEV_MDS
bpmMDSPassword=password

#
#  BPM Runtime details
#  Provide the BPM server weblogic and admin credential here
#

# Specify the BPM server URL (t3://<bpmHost>:<bpmRuntimePort>) in the case of a single
# BPM server, ex- t3://myHost:8001
# In case of BPM Cluster provide the ',' separated list of BPM servers URL's (t3://<host1>:<port1>,<host2>:<port2>,...)
# for all the servers in the Cluster . Example: t3://myHost1:8001,myHost2:8002,myHost3:8003
bpmServerURL=t3://SOABPM1:8001

bpmAdminUser=weblogic
bpmAdminPassword=Passw0rd01


#
#  Information of the Webcenter server where process BPM process portal would be installed
#

#
#  Webcenter spaces installation details
#  Provide the webcenter space server information
#
#  Provide the oracle home location of the webcenter install (e.g. /Oracle/Middleware/Oracle_WC)
#  in wcOracleHome
wcOracleHome=/u01/app/oracle/product/fmw/wc
#  Provide the Webcenter domain name in wcDomainName
#  --if extendSoa flag has been set to true, Webcenter domain name should be the same as SOA domain name
#  --if extendSoa flag has been to false, Webcenter domain name will be different from SOA domain name
wcDomainName=domain_name



#Mention Whether the webcenter install is configured for cluster or not;
#pass 'true' if in cluster mode, 'false' otherwise
isWebcenterClusterConfig=false

#Required if 'isWebcenterClusterConfig' is set to true
# Specify the name of the webcenter spaces Cluster
wcSpacesClusterName=

#  Webcenter's weblogic installation details
wcHost=SOABPM1
wcAdminPort=7701
wcAdminUser=weblogic
wcAdminPwd= password

#In the case of a single server environment,
#specify the name of the Webcenter Spaces Managed server. In a clustered environment,
#specify the name of any one of the Spaces managed servers that is part of the Cluster.
wcManagedServerName=WC_Spaces


#Flag to control whether to configure services
wcConfigServices=true

#content server details
wcContentServerName=SOABPM1
wcContentServerPort=4444
wcContentSpacesRoot=/WebCenter0809
wcContentAdminUser=weblogic

#discussion server details
wcDiscussionServerUrl=http://SOABPM1:8890/owc_discussions
wcDiscussionAdminUser=weblogic


6. Jalankan ant script dengan memasukkan command berikut:


7. Build successful akan muncul apabila konfigurasi yang anda buat di tahap nomor 5 sudah benar.
8. PENTING!! Edit lagi file konfig di langkah nomor 5. Pastikan value extendSoa=true. Jalankan kembali script dengan mengeksekusi perintah di step nomor 6 dan hasil berikut muncul:



9. Restart Seluruh Managed Server dan Admin Server anda.

10. Masuk ke Weblogic Server /em. Navigasi ke server Webcenter Portal Anda. Pilih Application Configuration -> Service Configuration dan layar berikut akan muncul. Cek di bagian Content Repository, pastikan bahwa koneksi portal-content-server berhasil dibuat dan menjadi active connection.
11. Klik koneksi tersebut, ganti Administrator User Name menjadi user name admin anda (dalam kasus saya weblogic).
12. Cek juga di Discussion and Announcement, koneksi baru, portal-discussions berhasil juga dibuat.
13. Kedua tahap diatas menandakan bahwa konfigurasi anda berhasil dan BPM Workspace sudah dapat diakses melalui Spaces!

14. Log in ke dalam spaces dan anda akan menemukan Spaces baru bernama Process Spaces. Ini adalah BPM workspace yang telah terintegrasi ke dalam portal. Disini anda dapat log in, membuat task baru, membuka task yang di-assign kepada anda dan melakukan proses approval layaknya fungsionalitas yang ada di BPM.

Apabila anda membuat project BPM baru dan mendeploynya ke soa_infra, maka otomatis project/process ini akan muncul juga di Process Workspace yang ada di Webcenter Spaces. Akses user untuk menggunakan aplikasi di BPM sekarang sudah dapat diarahkan melalui portal!

Selamat! Anda berhasil mengintegrasikan BPM Workspace dan Spaces Anda.
Semoga membantu. See u in the next blog!




Webcenter Portal (Spaces) and Oracle BPM Integration - Part 1

Blok kali ini akan membahas bagaimana cara mengintegrasikan Oracle BPM Workspace ke dalam Webcenter Portal (Spaces). Apabila kita membangun aplikasi BPM yang berjalan di BPM workspace & Portal, akan terdapat 2 workspace, 1 portal dan 1 bpm workspace. Hal ini tentu tidak praktis, karena portal harusnya menjadi gerbang utama tempat user mengakses semua aplikasi, akan tetapi BPM workspace mempunyai URL sendiri yang berjalan di tempat yang berbeda dengan portal. 

Karena set up untuk proses ini cukup panjang, maka saya akan membagi blog menjadi 2 bagian. Bagian 1 ini akan menjelaskan persiapan yang diperlukan sebelum integrasi. Perlu diingat bahwa meskipun ini namanya 'Persiapan' dan terdengar sepele, tapi tahap ini harus dikerjakan terlebih dahulu agar tahap berikutnya dapat berjalan.

Problem:
  • Webcenter Portal dan BPM sudah terinstall, tapi memiliki URL yang berbeda. Akses ingin dilakukan melalui 1 gerbang yaitu Webcenter Portal.


Solution:
  • Menggabungkan workspace BPM ke dalam Webcenter Portal

Result:
  • User dapat mengakses BPM workspace melalui portal. Seluruh capability workspace BPM seperti inbox, initiate Process, Approve, Reject dsb dapat dilakukan melalui Webcenter Portal.
  • BPM composer juga dapat berjalan di Portal

Prerequisite:
  • Webcenter Portal, Oracle BPM dan Webcenter Content sudah terinistall (tutorial ini menggunakan versi 11.1.1.7 untuk ketiga sistem)
  • Basic knowledge untuk navigasi ke halaman-halaman administrasi masing-masing komponen diatas :)
Untuk memungkinkan hal diatas di portal, ikuti langkah-langkah dibawah ini. PENTING: langkah-langkah ini harus diikuti step by step sebelum anda masuk ke bagian inti yang saya jelaskan di Part 2.

1. Kita mulai dari webcenter Content. Buka Advanced Component Manager -> show All Components


2. Di bagian Disabled Components, klik Enable untuk komponen Folders_g
3. Lakukan hal yang sama untuk komponen WebCenterConfigure
4. Pastikan 2 komponen diatas masuk ke bagian Enabled Components berikut komponen dibawah:
- Dynamic Converter
- InboundRefinerySupport
- ZipRenditionManagement
5. Buka Applet User Admin. Add User baru dengan Authorization Type = Local dan nama PersonalSpaces
6. Untuk User tersebut, buat juga Role baru dengan menekan tombol Add Role
7. Beri nama PersonalSpaces untuk Name dari role baru tersebut
8. Lakukan Step 5-7, beri nama user dan role-nya ProcessPortal
9. Add Role = Process Portal
10. Masuk ke weblogic server /console. Masuk ke security realm yang anda gunakan. Buat Group baru dengan nama ProcessPortalUser
11. Masuk ke weblogic server /em. Masuk ke farm domain anda, navigasi ke instance Content Server anda. Masukkan filter IP address yang sesuai, dan masukkan Intradoc Server anda. Dalam contoh ini saya menggunakan 4444
12. Masuk ke instance Webcenter Portal anda. Add Repository Connection ke Webcenter Content dengan memasukkan detail berikut. PENTING!! Server Port harus sama dengan nilai yang anda masukkan di tahap 11.

13. Restart Admin Server, SOA Server dan Spaces anda.

Oke. Tahap persiapan sudah selesai :)
Untuk lanjut ke tahap inti dari integrasi, kita akan lanjut ke blog berikutnya: Webcenter Portal (Spaces) and Oracle BPM Integration - Part 2.
Selamat Mencoba!


Sunday, November 3, 2013

REST service aggregator di WSO2 ESB


Sekilas tentang ESB (Enterprise Service Bus)

Enterprise Service Bus  adalah sebuah platform integrasi berbasisstandar yang mengabungkan pesan, layanan web, transformasi data dan routing cerdas untuk menghubungkdan dan mengkoordinasikan interaksi sejumlah aplikasi yang beragam di suatu perusahaan dengan integritas transaksional (Chappell, 2004). Dengan kata lain ESB merupakan infrastruktur untuk mengintegrasikan aplikasi dan layanan. ESB memperkuat SOA melalui pengurangan jumlah, ukuran dan kompleksitas interface antara aplikasi dan layanan-layanan.
(dikutip dari : wikipedia)

Tugas utama ESB adalah:
1. Memantau dan mengontrol routing pertukaran pesan antar layanan
2. Mengatasi konflik/ketidaksesuaian antar komponen layanan komunikasi
3. Mengontrol penyebaran dan versioning dari layanan
4. Penyusunan penggunaan servis redundant
5. Melayani jasa komoditas seperti penanganan event, transformasi data dan pemetaan, pesan dan event antrian serta penanganan, keamanan atau pengecualian penanganan, konversi protokol dan menguatkan kualitas layanan komunikasi yang tepat

Dalam tutorial kali ini kita akan menggunakan WSO2 ESB. ESB ini bersifat open source.  Mengenai detail dan keunggulan apa saja di software ini dapat dilihat di situsnya langsung di wso2.com

Tutorial kali ini akan khusus membahas bagaimana cara aggregasi 2 buah atau lebih Rest webservice menjadi 1 output Rest.

Pengantar Aggregator

The Aggregator menggabungkan hasil individu, pesan terkait sehingga mereka dapat diproses secara keseluruhan. Dia bekerja sebagai filter stateful, mengumpulkan dan menyimpan beberapa message individu menjadi satu set message yg utuh dan kemudian mengirimkannya. (http://www.eaipatterns.com/Aggregator.html)



Dari gambar diatas terlihat ada 3 service message yg terpisah (Inventory item 1, item 2, item 3). Oleh si Aggregator 3 message tersebut akan diAggregasi menjadi 1 service yakni Inventory Order

Kita langsung saja pada contohnya.

1. Download terlebih dahulu software WSO2 ESB (http://wso2.com/products/enterprise-service-bus/). Berbentuk file zip.
Ekstrak file zip tersebut, kemudian masuk ke direktori /bin.
Jalankan wso2server.bat (windows) atau wso2server.sh (Unix)

2.  Jalankan https://localhost:9443
Tampilannya seperti ini


Untuk login awal masukkan username : admin password : admin



3. Kita siapkan dulu Rest webservice nya.
Untuk cara paling mudah bisa menggunakan framework Spring MVC.
Untuk cara membuatnya akan saya bahas ditutorial berikutnya. ☺

Asumsinya sudah tersedia 2 buat Rest webservice :
http://localhost:8087/sample/students/get

saat dipanggil dibrowser outputnya seperti ini :

http://localhost:8088/sample/schools/getStudent


Kedua Rest diatas mempunyai element yg sama yakni ‘students’, tetapi isi datanya berbeda. Element inilah nanti yang akan diAggregasi
Syarat melakukan aggregasi, Rest nya harus memiliki element yg sama

4.  Kita buka kembali halaman console WSO2.
Kita kita pilih di menu utama -> Source View



Kemudian kita buat script service proxy sebagai berikut (misal namanya : StudentAggregateProxy) :

 <?xml version="1.0" encoding="UTF-8"?>  
 <proxy xmlns="http://ws.apache.org/ns/synapse"  
     name="StudentAggregateProxy"  
     transports="https,http"  
     statistics="disable"  
     trace="disable"  
     startOnLoad="true">  
   <target>  
    <inSequence>  
      <log level="full"/>  
      <clone>  
       <target>  
         <endpoint name="ReceiverA">  
          <address uri="http://localhost:8087/sample/students/get/" format="rest"/>  
         </endpoint>  
       </target>  
       <target>  
         <endpoint name="ReceiverB">  
          <address uri="http://localhost:8088/sample/schools/getStudent/" format="rest"/>  
         </endpoint>  
       </target>  
      </clone>  
    </inSequence>  
    <outSequence>  
      <aggregate>  
       <completeCondition>  
         <messageCount/>  
       </completeCondition>  
       <onComplete expression="//students">  
         <send/>  
       </onComplete>  
      </aggregate>  
    </outSequence>  
   </target>  
   <description/>  
 </proxy>  

Tambahkan script diatas ke source view. Kemudian update.

Pada inSequence kita melakukan clone masing masing target Rest endpoint.  
Pada outSequence (outputnya) kita melakukan aggregasi menggunakan tag <aggreagte>. Kemudian pada onComplete ditambahkan expression “//students”. Ini artinya element “students” dari masing masing output endpoint akan diAggregate (digabungkan)                      

5.  Maka service proxy akan otomatis ditambahkan.
Pilih menu Service -> list.
Maka service proxy “StudentAggregateProxy” akan muncul di listnya



Untuk mengedit service proxy yg kita sudah buat. Klik “Source View”



6.  Selanjutnya akan kita coba servicenya.
Kita panggil url : http://localhost:8280/services/StudentAggregateProxy/


di ouputnya terlihat data ‘students’ dari enpoint pertama dan kedua sudah digabungkan.

Sebenarnya masih banyak hal yang perlu diexplore tentang aggregasi ini, sebab masih ada kelemahannya. Misalnya salah satu endpoint sedang mati, maka service proxy nya tdk jalan atau error.
Jadi mari sama-sama kita pelajari :)

Terima kasih.
Selamat mencoba ☺