Thursday, September 22, 2005

My First JBI Component

วันนี้ทดลอง implement JBI Component
(Java Technology and Business Integration Services)
เพื่อที่จะทดลอง deploy เข้าไปใน ServiceMix

เหมือนเคย ถ้าทำตาม spec ของ Sun แล้ว
คงต้องทำอะไรต่างๆนานายุบยับไปหมด
(ตามประสา sun ที่ spec มักจะแบ่งเป็นขั้นเป็นตอน
ขั้นนี้ให้ role นี้ทำนะ ขั้นนู้นให้ role นู้นเขาเป็นคนทำ)
พวก developer มือเดี่ยวอย่างเรา (ทำมันทุก role)
ก็เลยขัดอกขัดใจ

โชคดีที่ ServiceMix เปิดช่องให้เรา
ใส่ component ของเรา ผ่านเข้าไปโดยใช้
Spring config file ทำให้ชีวิตง่ายขึ้น

เนื่องจากเป็น component แรกในชีวิต ก็เลยจัดการลอก
จากตัวอย่างที่มีนั่นแหล่ะดัดแปลงนิดหน่อย

เป้าหมายที่ทดสอบ


Quartz timer component ===msg===> Log Component



Quartz Timer Component ก็ใช้ build in ของ ServiceMix
ไม่ต้องลงแรง
ส่วน Log Component ก็ลอกเขามาเลย


public class LogComponent extends ComponentSupport {

private Log log = LogFactory.getLog(TraceComponent.class);


public Log getLog() {
return log;
}

public void setLog(Log log) {
this.log = log;
}

public void onMessageExchange(MessageExchange exchange) throws MessagingExce
ption {
// lets dump the incoming message
NormalizedMessage message = exchange.getMessage("in");
if (message == null) {
log.warn("Received null message from exchange: " + exchange);
}
else {
log.info("Exchange: " + exchange + " received IN message: " + messag
e);
}
}
}


ทดลอง run ปรากฎว่า เงียบหาย
ไม่เห็น message อะไรที่ console
ก็เลยสงสัยว่าเกิดอะไรขึ้น
นั่งพยายามค้นหาอยู่นาน
ในที่สุดก็พบว่า
  • ห้ามลืม implements MessageExchangeListener เด็ดขาด ถ้าลืมมันจะไม่สามารถรับ message ได้
    public class LogComponent extends ComponentSupport 
    implements MessageExchangeListener {...}

    อันนี้ผิดเอง ลอกเขามาแล้วยังลอกผิดอีก
  • ที่เราสั่ง log แสดงผลนั้น มันจะไม่แสดงผลอะไรออกมาให้เราเห็น
    ส่วนสาเหตุนั้นยังนึกไม่ออก ตอนแรกนึกว่าเป็นเพราะชื่อ package เราไม่ตรงกับเขา
    ตัว Logging Filter ก็เลยไม่แสดงผลของเรา
  • คำสั่ง System.out.println จะไม่แสดงผลออกที่ console
    ไม่รู้มัน redirect ไปไว้ไหน
  • สุดท้ายก็เลยต้องใช้วิธีเขียน log ลง File System เอง
    ก็เลยพบว่ามันทำงานได้เป็นปกติ


หลังจากอ่านเอกสารของ ServiceMix ไปสักพัก
ก็พบว่า เราสามารถ implement Component
ในลักษณะ POJO ได้เลย
public class PojoReceiver implements MessageExchangeListener {

public void onMessageExchange(MessageExchange exchange) throws MessagingExce
ption {
NormalizedMessage message = exchange.getMessage("in");
....

}

}


เป้าหมายที่จะลองถัดไปก็คือ
check ดูว่า ActiveMQ ที่ bundle มานั้น support Stomp Protocol แล้วหรือยัง
ถ้ายังก็จะได้ upgrade เสีย
หลังจากนั้นก็ทดลอง integrate ruby application
เข้ากับ ServiceMix ผ่านทาง Stomp protocol

Related link from Roti

No comments: