Sunday, October 09, 2005

JBI Interface Name & Service Name

ในการ implement JBI component
จะมีศัพท์พื้นฐานที่ต้องทำความเข้าใจอยู่จำนวนหนึ่ง
ไม่เช่นนั้นอาจจะต้องปวดหัวกับการ ส่ง message ไม่ได้
หรือ message วิ่งหายต๋อมไม่รู้ไปไหน

ศัพท์ตัวแรกก็คือคำว่า interface
เป็นศัพท์ที่ define ไว้ใน spec ของ WSDL 2.0
มีความหมายเดียวกับ คำว่า porttype ใน spec WSDL 1.1
10 ปากว่า ไม่เท่าตาเห็น
ลองดู WSDL 1.1 ของ google ดู
<portType name="GoogleSearchPort">

<operation name="doGoogleSearch">
<input message="typens:doGoogleSearch"/>
<output message="typens:doGoogleSearchResponse"/>
</operation>

</portType>

ถ้าเปรียบเทียบกับ OOP term
interface ใน WSDL 2.0 ก็มีความหมายเหมือนกัน interface ใน OOP

ศัพท์ตัวถัดไปก็คือ service
ความหมายก็คือ implementation ของ interface นั่นเอง

ศัพท์ตัวถัดไปก็คือ endpoint
endpoint คือจุดที่เกิดการเชื่อมต่อจริงๆ
คล้ายๆความหมายของ port ในเรื่อง socket (network)
ลองดูความหมายที่ WSDL 2.0 define ไว้ (JBI endpoint มีความหมายเดียวกับ WSDL endpoint)
Endpoints, in WSDL 2.0, refer to a particular address, accessible by a particular protocol, used to access a
particular service




ความสัมพันธ์ระหว่าง service กับ endpoint เป็น one-to-many ก็คือ
service หนึ่งๆมี endpoint ได้หลาย endpoint

เวลาเราส่ง Message ใน JBI
เราสามารถระบุ target ที่จะส่งได้ 2 วิธีคือ
  • ระบุแค่ service name
    ถ้าระบุแค่นี้ ตัว JBI container จะตัดสินให้ว่า ควรจะส่งให้ endpoint ไหนดี
  • ระบุทั้ง service name และ endpoint name (มีศัพท์เรียกว่า service endpoint)


ที่นี้ลองดูที่ jbi.xml จริงๆบ้าง
<services binding-component="false"
xmlns:logger="http://pok/dblogger/">
<provides interface-name="logger:log-interface"
service-name="logger:log"/>
</services>

source ข้างบนก็คือ การ define service ของ provider
จะเห็นว่ามีการระบุ interface-name กับ service-name

ถ้าเราไปดู source code ของ Java Class ที่ implement service นี้
public class DbLoggerComponent implements 
ServiceInterfaceImplementation,
ServiceEndPointImplementation {

public QName getInterfaceName() {
return new QName("http://pok/dblogger/",
"log-interface");
}

public void onMessage(MessageExchange msg) {
...
}
}

จะเห็นว่ามี method ที่ชื่อ getInterfaceName

เวลาเราเขียน component ใน servicemix
เราสามารถเลือกวิธีเขียนได้ 2 วิธีคือ
  • implment interface ของ JBI-api ด้วยตนเอง
  • ใช้ client-api ของ ServiceMix
    อันนี้จะสะดวกสบายขึ้นหน่อย จำนวนบรรทัดของ source code
    ที่เขียน จะลดลงหน่อย


ในที่นี้เราจะพูดถึงการเขียน component แบบที่ใช้ client-api เท่านั้น
เริ่มโดย เวลาเราเขียน component เราก็จะเขียน class ที่ implement
interface ServiceInterfaceImplementation
ซึ่งใน interface นี้จะบังคับให้เรา implement method ที่ชื่อ
getInterfaceName
ส่วน service name และ endpoint name
คงจะใช้การ lookup จาก jbi.xml

กรณีที่เรามี endpoint มากกว่า 1 endpoint ใน 1 service
การ implement แค่ ServiceInterfaceImplementation
จะไม่เพียงพอ ต้องมีการ implement ServiceEndPointImplementation
interface นี้จะบังคับเราให้เรา implement method getServiceName
กับ getEndpointName

Related link from Roti

No comments: