แก้ Bug thai locale ใน quartz

Quartz เป็น library ที่ทำให้เราสามารถตั้งเวลา run งานใน Java ได้ เหมือนกับที่ทำจาก cron ใน unix นั่นเอง เหตุผลที่เราเอาความสามารถในตั้งเวลา run งาน (schedule) มาทำในตัวโปรแกรมเนื่องจากสามารถบริหารจัดการได้ดีกว่าใน cron อีกทั้ง quartz ยังสามารถทำงานได้ละเอียดในระดับของวินาที

อาการของ bug ตัวนี้คือ ถ้าหากเราใช้ locale ภาษาไทยใน OS ตัว quartz จะไม่ทำงานแถมมี Exception เกิดขึ้นดังนี้

org.quartz.SchedulerException: Based on configured schedule, the given trigger will never fire.

แต่ถ้าเปลี่ยน locale เป็นภาษาอังกฤษกลับไม่เป็นอะไร ใน Windows XP สามารถแก้ปัญหานี้ได้โดยการเปลี่ยนค่าใน Regional and Language Options ที่ Tab Regional Options ในส่วนของ Standards and formats ให้เป็น English (United States) แทนที่จะเป็น Thai ปัญหานี้ก็จะหมดไป แต่วิธีนี้ไม่ใช่วิธีที่ดีนัก ทางที่ดีเราควรเข้าไปจัดการกับต้นตอของปัญหามากกว่า

bug ของ quartz อันนี้มีมานานแล้ว โดยมีการพูดคุยอยู่ใน form ของ OpenSymphony เองเข้าใจว่าคนที่เจอปัญหาเป็นคนไทยที่ใช้ locale ภาษาไทยใน OS อย่าง Microsoft Windows ปกติที่เรามักตั้งให้เป็นภาษาไทย ใน Java comminity ของไทยอย่าง Narisa เองก็มีการพูดคุยถึงปัญหานี้เช่นกัน

เนื่องจากผมต้องใช้ quartz กับโครงการ OpenCARE จึงได้ถือโอกาสจัดการกับปัญหานี้โดยนั่งไล่ code อยู่วันนึงเต็มๆ ความจริงมี guide line จาก form ของ OpenSymphony ที่คุณ ake ตอบไว้ให้นิดหน่อย แต่ตอนนี้ quartz version 1.6 code ส่วนนั้นมันไม่ได้อยู่ใน CronTrigger.java อีกแล้ว เลยต้องมานั่งไล่ดูเอาเองซึ่งสุดท้ายมาเจอต้นตอว่าอยู่ในไฟล์ CronExpression.java (ความจริง ถ้ามั่วๆหน่อยลอง grep -r ‘year > 2099’ * คงหาเจอไปนานแล้ว -*-)

ปัญหาก็เหมือนที่คุณ ake บอกไว้ใน form ผมเลยจัดการแก้ code ในไฟล์ CronExpression.java ที่บรรทัด 1034 นิดหน่อย โดยบังคับ locale เป็น US

จาก

Calendar cl = Calendar.getInstance(getTimeZone());

เป็น

Calendar cl = Calendar.getInstance(getTimeZone(), Locale.US);

เสร็จแล้วก็จัดการ compile และ pack กลับเป็น jar ก็สามารถเอาไปใช้งานได้โดยไม่ต้องไปแก้ไขอะไรใน Microsoft Windows หรือในส่วนของ locale อีกต่อไป

4 คิดบน “แก้ Bug thai locale ใน quartz

  1. ิbug ตัวเดียวกับที่พี่พูดถึงในตอน workshop tapestry เลย

    ตัว jar ที่เรา pack เองนี้ ต้องระวังหน่อยนะ
    พอผ่านไปสัก 3 ปี, บางทีมันจะลืมว่าทำอะไรไปบ้าง

    opencare ทำอะไรถึงไหนแล้ว
    เล่าให้ฟังบ้างสิ

  2. ใช่แล้วครับ ถ้าพี่ไม่บอกว่าแก้ใน code ของ quartz เอาก็คงไม่คิดจะทำ ^^

    สำหรับ OpenCARE ตอนนี้พยายาม feed GDACS เข้าไปใน message bus (ActiveMQ)

    ข้อมูลที่เอามาเป็นข้อมูลเกี่ยวกับแผ่นดินไหว fึงมาในรูปของ rss แล้วแปลงเป็น EDXL (ด้านในห่อ CAP ไว้อีกที)

    งานที่ทำไปแล้วก็คือเขียน XSLT stylesheet เพื่อแปลง GDACS เป็น EDXL
    ความจริง sugree ทำไว้แล้วแต่เขียนด้วย python -*- ผมคิดว่าใช้ XSLT จะยืดหยุ่นกว่า

    ที่พูดถึง quartz ก็เพราะจะเอามา poll rss นี่ล่ะครับ ตอนนี้เกือบเสร็จแล้ว ไม่ได้เขียนโปรแกรมนานกำลังปัดฝุ่น Spring อยู่ อิอิอิ เอาไว้ feed และดึงข้อมูลแล้วเดี๋ยวหาเว็บทำ demo ให้พี่ดูครับ🙂

  3. Pingback: bug quartz ของไทย บั๊กของเราเอง « กลุ่มเพื่อนนาวิน

  4. Pingback: แก้ปัญหา Quartz บนเครื่องที่มี Locale เป็นไทย | MagicKiat's Weblog

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s