Tuesday, August 21, 2007

ขั้นตอนการ start ของ Ofbiz

ลองแกะขั้นตอนการ start ของ Ofbiz ดู ก็พบขั้นตอนที่น่าสนใจดังนี้

1. เหมือนกับ framework ใหญ่ๆทั่วๆไป นั่นคือ
ถ้าต้อง start อะไรที่ซับซ้อนนัก ก็ควรมี bootstrapping code
โดย class ที่เป็นจุดเริ่มต้นทำงานของ Ofbiz ก็คือ org.ofbiz.base.start.Start.java
เมื่อ initialize ค่าเบื้องต้นต่างๆหมดแล้ว (เช่น log directory, base class path)
ก็จะทำการ load configuration ตาม command parameter ที่ user สั่งผ่าน command-line มา
เช่น ผมสั่ง
java -jar ofbiz.jar -pos
มันก็จะไปใช้ configuration file ที่ชื่อ /framework/base/src/start/org/ofbiz/base/start/pos.properties
ถ้าสั่ง
java -jar ofbiz.jar
มันก็จะใช้ default configuration file ซึ่งก็คือ start.properties

element ที่สำคัยภายใน properties file ข้างบน ก็คือ ofbiz.start.loader* (* คือเลขลำดับในการ load)
ตัว loader ที่สำคัญของ Ofbiz ก็คือ org.ofbiz.base.container.ContainerLoader
ซึ่งเมื่อมัน load ขึ้นมา มันจะใช้ค่า ofbiz.container.config ที่ระบุใน configuration file
ในการ load container ขึ้นมาทำงาน

2. ofbiz มองว่า การ start ครั้งหนึ่งๆ เราสามารถกำหนด container ที่เราต้องการได้หลายตัว
โดยต้องสร้าง xml file ที่ระบุ container ที่ต้องการ
และระบุชื่อ file ไว้ใน configuration ผ่าน property ที่ชื่อ ofbiz.container.config

อย่างในกรณีที่เราจะ start โปรแกรม point of sell
ค่า ofbiz.container.config ก็จะกำหนดแบบนี้
ofbiz.container.config=framework/base/config/pos-containers.xml

ofbiz ก็จะใช้ file pos-containers.xml ในการเลือก start container ที่ต้องการ

3. Container ที่สำคัญๆ และขาดไม่ได้ ของ Ofbiz ก็คือ
3.1 component-container ทำหน้าที่ load component ต่างๆ
ทั้งที่เป็น framework component และ application component
โดย default มันจะใช้ file framework/base/config/component-load.xml เป็นจุดตั้งต้นในการ load
ซึ่งภายในจะ recursive load module ของ framework, applications, specialpurpose, hot-deploy
ถัดจากตรงนี้ไป ยังมีเรื่องให้ตามอีกยาว ดังนั้นจะพักไว้แค่ตรงนี้ก่อน

3.2 classloader-container
ตรงนี้ยังแกะไม่เข้าใจ
โดย ofbiz จะใช้ classloader ที่ชื่อ CacheClassLoader.java

จากที่ตามดูขั้นตอนการ load Point of Sell
พบว่า ofbiz มัน load ทุก component, ทุก applications
ดูเหมือนจะ load เยอะกว่าที่เราต้องการ

ประเด็นที่น่าสนใจ กรณีจะทำเป็น Eclipse RCP
1. จะ pack มันเป็น bundle(plugin) อย่างไร
การ pack เป็น bundle จะส่งผลต่อ code แค่ไหน
ใช้ wrapping อย่างเดียว เพียงพอหรือไม่
ปัญหาที่ตามมา ก็คือเรื่อง class loader
เนื่องจาก Eclipse มี model class loader ที่ค่อนข้าง strict

2. ถ้าไม่ใช้ Eclipse RCP แต่เปลี่ยนไปใช้แค่ SWT+JFace
น่าจะช่วยให้หลีกเลี่ยงปัญหาก้อนใหญ่ไปได้

Related link from Roti

3 comments:

Anonymous said...

เป็นบลอกที่มีรายละเอียดน่าสนใจมาก ขอบคุณที่เล่าให้ฟัง

เรื่อง classloader เป็นหัวข้อที่ซับซ้อนของจาวา ส่วนใหญ่ framework จะมีการจัดการ class loading ของตัวเอง เพื่อสนับสนุนการโหลดไฟล์ .class เวอร์ชั่นใหม่ๆมาใช้ในตอนรัน (ลองคิดดูว่าถ้าเราคอมไพล์ไฟล์จาวาเป็น .class แล้วต้องการให้ framework dynamically loads .class ตัวนี้ไปรันแทนที่ .class ตัวเก่า) ถ้าเป็น class loader มาตรฐานของจาวาจะไม่สนับสนุนฟีเจอร์นี้ ทำได้แค่เพียง restart โปรแกรมใหม่เท่านั้น

ส่วนเรื่อง Eclipse RCP ผมเข้าใจว่า RCP มีไว้เพื่อพัฒนาโปรแกรมฝั่ง client เพื่อใช้ติดต่อกับ OFBiz จำเป็นต้อง bundle components พวกนี้ด้วยหรือครับ

PPhetra said...

ขอบคุณคุณข้าวโพดหวานครับ
ผมลืมประเด็นเรื่อง dynamically load class ไปเลย

> OFBiz จำเป็นต้อง bundle components พวกนี้ด้วยหรือครับ

ความแตกต่างของ POS กับ web application
นอกจาก UI layer ที่ต่างกันแล้ว นอกนั้นจะเหมือนกันทุกอย่าง (share ใช้ service เดียวกัน,
ที่สนุก ก็คือมันส่งผลให้ database ของ pos
พลอยมี table ครบตาม server ไปด้วย ~700 table)

ซึ่งถ้ามองในแง่ container แล้ว, เวลา start pos หรือ web application, ตัว container ที่ต่างกันก็คือ UI container
ดังนั้นถ้าเราจะนำไปใช้กับ eclipse rcp
เราต้องหาวิธี pack service ที่มีอยู่แล้วให้เป็น bundle ให้ได้ครับ
(ยกเว้นว่า พัฒนาโดยไม่สนใจใช้ service เดิมเลย)

Anonymous said...

ในความคิดของผมเรื่องการนำเอา eclipse rcp มาเป็น client ผมคิดง่ายๆนะครับ ใช้ rmi ที่OFBiz เครียมมาให้เพราะว่าเราสามารถ export ที่เราสร้างให้เป็น rmi ได้เลย โดย เพิ่ม export="true" ตรง service def ส่วน class ที่จำเป็นสำหรับการใช้งานต่างๆก็ copy มาใส่ไว้ใน eclipse rcp เลย หรืออาจจะไม่ต้องใช้เลย ตอนนี้ผมยังไมไ่ด้ศึกษารายละเอียดของ engine ส่วนการ bundle OFBiz ลงใน eclipse rcp นั้น ผมคิดไว้สองวิธีคือ ให้ OFBiz โหลด eclipse หรือให้ eclipse โหลด OFBiz (OFBiz ก็เหมือนกับ Application Server ทั่วไป)ในเมื่อเราใช้ eclipse start tomcat ได้ก็แสดงว่าเรา start OFBiz ได้วิธีที่เลวร้ายสุดคือใช้ Ant วิธีที่ผมคิดอาจจะฟังดูง่ายแต่จะทำได้หรือไม่นั้นคงต้องไปศึกษาดูอีกทีครับ