Apache ServiceMix เป็น Enterprise Service Bus ที่สร้างมาจาก product ของ apache ทั้งหมด โดยส่วนประกอบหลักๆจะมีดังต่อไปนี้

  1. Camel :  route engine เป็นตัวรับและส่งต่อข้อมูลไปยัง endpoint ต่างๆ
  2. ActiveMQ : messaging server ทำหน้าที่ให้บริการ Queue/Topic
  3. CXF : Webservice framework สำหรับไว้สร้าง Webservice
  4. Karaf : OSGi server ควบคุม life cycle/dependency ของ service ต่างๆ (start stop install uninstall เป็นต้น)

มีญาติพี่น้องอีกสองคนคือ Jboss Fuse ESB และ TalendESB

คราวนี้เราจะลองมาเล่นเจ้า ServiceMix นี่กัน โดยเริ่มจาก start servicemix ด้วย servicemix.bat ใน bin/ โดย servicemix ก็จะทำการโหลด module ทั้งหลายผ่าน Karaf พอ module ทั้งหมดโหลดเสร็จแล้ว ก็จะ return หน้า console มาให้เรา โดย instance ที่เราสร้างขึ้นมาชื่อ root (แก้ได้ผ่าน property karaf.name)

serv1

โอเคมาถึงตรงนี้เรา start เสร็จหมดละ เนื่องจากมันเป็น opensource หน้าจอ webUI อะไรพวกนี้เราจะต้องลงเองนะครับ โดยผมแนะนำให้ใช้ hawtio เป็น webUI อย่างดีสามารถใช้งานได้กับ JVM ทุกตัวก็ได้ว่า เพราะว่าใช้ JMX query mbeans เป็นหลัก การ Install hawtio ให้ทำตามนี้

features:addurl mvn:io.hawt/hawtio-karaf/1.3.0/xml/features
features:install hawtio

โดยจะเป็นการเรียกใช้งาน feature ไปเรียก remote maven repository อีกทีนึง (มั้ง) ซึ่ง feature ก็คือการนำเอา bundle (OSGi term) และ dependencies มารวมกัน โดย bundle เราอาจจะคิดได้ว่ามันคือ Application 1 ตัว แต่หากเรามี app หลายๆตัว ต้องการรวมกลุ่มกัน เราก็ควระใช้ feature
ตัวอย่างง่ายๆของ features

<features name=”abc”>
<feature name=”abc-base”>
<bundle>mvn:krisa.camel.routes/queue-consumer/1.0/bundle>
<bundle>mvn:krisa.ws/websocket-web/1.0/bundle>
</feature>
</features>

 
กลับมาที่ Hawtio หลังจาก install เสร็จแล้ว ให้ลองรันคำสั่ง osgi:list |grep hawtio น่าจะ return ออกมาแบบนี้
serv2
จะเห็นว่า bundle hawtio-web ได้ active แล้ว ให้ลองเข้าไปที่ localhost:8181 ด้วย user/pass smx/smx ซึ่งสามารถแก้ได้ใน etc/user.prop..
serv3หน้า UI นี้ทรงพลังมากเลยทีเดียว สามารถ start/stop/install/uninstall features/bundle, edit/debug/trace/profile camel route, create/send/browse activeMQ ได้หมด
Camel บน servicemix
serv4
หน้านี้แสดง Camel Context ที่ผมลองสร้างเล่นๆไว้ จะเห็นว่ามันแสดงข้อมูลสำคัญเบื้องต้นให้เราดูด้วย ว่าเรามีกี่ context แต่ละ context มีสถิติเป็นอย่างไร ใช้งานง่ายมากๆไม่ซับซ้อน (ทำไม Oracle ไม่ทำแบบนี้บ้าง ทำไมต้องให้สร้าง tool มาเพื่อ manage app มันอีกทีนึงด้วยนะ = =’)
แล้วถ้าเราลองเข้าไปดูแต่ละ context เราก็สามารถเข้าไปดู route แต่ละ route ได้ แถมยังแก้ได้ทันทีอีกด้วย ไม่ว่าจะเป็น camel context จะเป็น java หรือ xml ก็ตาม
serv6สำหรับการ deploy นั้นสามารถทำได้สองแบบใหญ่ๆ คือ ทำผ่าน Blueprint (OSGi term) หรือเอา war/jar เข้าไปวางโดยตรง
ผมจะลองยกตัวอย่าง Blueprint ง่ายๆ ที่จะทำการ copy ไฟล์จาก folder input ไปยัง folder output (Ref. http://servicemix.apache.org/docs/4.5.x/quickstart/camel.html)

<?xml version=”1.0″ encoding=”UTF-8″?>
<blueprint
xmlns=”http://www.osgi.org/xmlns/blueprint/v1.0.0&#8243;
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221;
xsi:schemaLocation=”
http://www.osgi.org/xmlns/blueprint/v1.0.0
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd”&gt;

<camelContext xmlns=”http://camel.apache.org/schema/blueprint”&gt;
<route>
<from uri=”file:camel/input”/>
<log message=”Moving ${file:name} to the output directory”/>
<to uri=”file:camel/output”/>
</route>
</camelContext>

</blueprint>

โดยให้ save เป็นชื่ออะไรก็ได้ เช่น file_copy_service.xml แล้วเอาไปเซฟที่ deploy/ servicemix ก็จะทำการโหลดและ start blueprint นี้ให้เสร็จ โดยทำผ่าน OSGi นั่นเอง
ถ้าเราลอง osgi:list ก็จะเห็นชื่อ bundle ของเรา โดยเราสามารถสั่ง stop ได้ด้วย osgi:stop #ID โดยทุกๆ bundle จะมีเลข id ของมันเอง

หาต้องการดู log แล้วละก็ใช้คำสั่ง log:display  log อันยาวเหยียดก็จะถูก print ออกมา

ถ้าสนใจ ServiceMix แล้วละก็ให้ลองไป เล่นตัวอย่างจาก examples/ ดูครับ