Friday, August 17, 2007

Server VM crashes with jSegue

ในงานที่ทำอยู่ มีความจำเป็นต้องเรียกใช้ COM library ในการรับส่งแฟกส์จาก Java

ที่ผ่านมาสำหรับ COM เล็กๆ มีให้เรียกใช้ไม่กี่ฟังก์ชั่น เคยใช้ Jawin ซึ่งเป็น library ที่ประกอบด้วย .jar และ .dll ช่วยให้เราเรียกใช้ COM object ที่ลงทะเบียนอยู่ในระบบ Windows ได้ ผ่าน JNI

แต่สำหรับแฟกส์ มันมี Object ใน COM หลายตัว เขาเสนอให้ใช้ jSegue ซึ่งดูมีการพัฒนามานานกว่า และเขาก็เคยลองใช้ "tlb2java" ในชุดโปรแกรมสร้างคลาส Java ห่อ COM object ทำให้ใช้งานได้สะดวกขึ้นมาแล้ว

ขั้นตอนการทดสอบเป็นไปได้ด้วยดี แต่พอเอาเข้าไปใส่ใน JBoss Server ปุ้บ ปรากฏว่ามันทำให้ Java VM (SUM) ตาย เป็นระยะๆ ดูเหมือนจะเกิดเมื่อเรียกใช้งาน COM นั้นจากหลาย Thread ที่ต่างกัน

แต่เวลาแยกทดสอบต่างหากกลับทำงานได้ดี รันได้เป็นชั่วโมงๆไม่มีปัญหา

ลองเปรียบเทียบความแตกต่าง ฯลฯ จนพบว่า มันตายเพราะ JBoss เรียก Java VM ด้วยตัวเลือก "-server" ซึ่งเป็นการระบุให้ใช้ Server VM ใน The Java HotSpot(tm) Client and Server Virtual Machines เขียนไว้ว่า

The Java HotSpot Server VM is similar to the Java HotSpot Client VM, 
except that it has been specially tuned to maximize peak operating speed. 
It is intended for running long-running server applications, for which 
having the fastest possible operating speed is generally more important 
than having the fastest possible start-up time.

ลองเอา "-server" มาใส่ในโปรแกรมทดสอบ ก็ตายเหมือนกัน :) พอเอา "-server" ออกจาก JBoss ตอนนี้ก็เหมือนจะทำงานได้ดี (กำลังรอผลทดสอบ)

สรุปว่า jSegue ไม่ถูกกับ Server VM ของ Sun ?

No comments: