Bước 1 : Định nghĩa service interface
Ở đây chúng ta đã xác định các chức năng cần có của MathService (là cung cấp khả năng cộng và trừ 2 số). Chúng ta cần định nghĩa một interface cho MathService, interface này sẽ chứa các phương thức cần thiết cung cấp cho người dùng. Lưu ý service interface còn được gọi là portType. Việc định nghĩa interface ở đây sử dụng ngôn ngữ đặc tả GWSDL, một phiên bản mở rộng của WSDL cho Grid service. Có 2 cách để định nghĩa interface cho MathService :
+ Tự viết file GWSDL đặc tả.
+ Sử dụng công cụ tự động phát sinh file GWSDL từ giao diện lớp của Java.
Mỗi cách đều có những ưu khuyết điểm riêng, nếu phát sinh từ khai báo lớp Java thì chúng ta chỉ cần khai báo :
{
public void add(int a); public void subtract(int a); public int getValue(); }
Tuy nhiên, khi phát sinh bằng cách này sẽ không tận dụng hết tất cả các sức mạnh của GWSDL. Do đó nên tự viết các đặc tả interface cho service bằng GWSDL. Chi tiết về cách viết một tài liệu GWSDL xin tham khảo thêm trong ph ụ lục B – Định dạng file GWSDL. Lưu ý, ở đây các hàm add() và substract() chỉ có một tham số, chúng ta muốn thực hiện cộng dồn các số và chỉ gửi kết quả đến người dùng khi cần thiết, qua hàm getValue(). Ví dụ này muốn cho thấy Grid service là một thực thể có trạng thái (stateful), nó tự lưu trữ các kết quả qua một biến cục bộ và chỉ xuất ra khi cần thiết, đây là một tính chất mới mà một Web service truyền thống không có được.
Dưới đây là đặc tả (đã được rút gọn) của file GWSDL, chi tiết nằm trong File: GRIDSER_DEMO/schema/progtutorial/MathService/Math.gwsdl
--- <definitions ……… name="MathService" http://www.globus.org/namespaces/2004/02/progtutorial/MathServi ce ………
<!--Khai bao namespace--> <!--Khai bao cac thanh phan-->
………
<!--Dinh nghia cac message trao doi cac tham so cho cac phuong thuc-->
<message name="AddInputMessage">
<part name="parameters" element="tns:add"/> </message>
<message name="AddOutputMessage">
<part name="parameters" element="tns:addResponse"/> </message>
<message name="SubtractInputMessage">
<part name="parameters" element="tns:subtract"/> </message>
<message name="SubtractOutputMessage">
<part name="parameters" element="tns:subtractResponse"/> </message>
<message name="GetValueInputMessage">
<part name="parameters" element="tns:getValue"/> </message>
<message name="GetValueOutputMessage">
<part name="parameters" element="tns:getValueResponse"/> </message>
<!--Dinh nghia portType va cac phuong thuc (operation)-->
<gwsdl:portType name="MathPortType" extends="ogsi:GridService">
<operation name="add">
<input message="tns:AddInputMessage"/> <output message="tns:AddOutputMessage"/>
<fault name="Fault" message="ogsi:FaultMessage"/> </operation>
<operation name="subtract">
<input message="tns:SubtractInputMessage"/> <output message="tns:SubtractOutputMessage"/> <fault name="Fault" message="ogsi:FaultMessage"/> </operation>
<operation name="getValue">
<input message="tns:GetValueInputMessage"/> <output message="tns:GetValueOutputMessage"/> <fault name="Fault" message="ogsi:FaultMessage"/> </operation>
</gwsdl:portType> </definitions>
Mặc dù GWSDL là độc lập với ngôn ngữ lập trình, tuy nhiên cũng cần phải tham khảo đặc tả này khi lập trình với ngôn ngữ cụ thể (ở đây là Java), điều này được thực hiện thông qua các lớp cuống (stub class, khái niệm này được thừa kế từ Web service), các lớp cuống này được phát sinh tự động bởi các công cụ GT3. Việc cần làm là thực hiện ánh xạ giữa không gian tên(namespace) của GWSDL với các gói(package) của Java, thông qua một file ánh xạ (mapping file) như sau :
File : $GRIDSER_DEMO/namespace2package.mappings http\://www.globus.org/namespaces/2004/02/progtutorial/MathService= org.globus.progtutorial.stubs.MathService http\://www.globus.org/namespaces/2004/02/progtutorial/MathService/bindings= org.globus.progtutorial.stubs.MathService.bindings http\://www.globus.org/namespaces/2004/02/progtutorial/MathService/service= org.globus.progtutorial.stubs.MathService.service
Bước 2 : Viết mã thực thi cho service
Sau khi định nghĩa interface cho service, bước tiếp theo là thực hiện cài đặt interface trong một ngôn ngữ lập trình cụ thể (Java). GT3 cung cấp 2 cách để thực hiện việc cài đặt một interface cho service:
+ Viết một lớp kế thừa từ lớp GridServiceImpl, đây là lớp cơ sở của tất cả các Grid Service, lớp kế thừa chỉ cần cài đặt tất cả các phương thức định nghĩa trong file GWSDL. Lớp này cũng có thể có các phương thức, thuộc tính riêng của mình.
Phần này trình bày kỹ thuật cài đặt sử dụng tính kế thừa. Mã nguồn của file :
$GRIDSER_DEMO/org/globus/progtutorial/services/core/f
package org.globus.progtutorial.services.core.first.impl;
import org.globus.ogsa.impl.ogsi.GridServiceImpl;
import org.globus.progtutorial.stubs.MathService.MathPortType;
import java.rmi.RemoteException;
public class MathImpl extends GridServiceImpl implements MathPortType
{
private int value = 0; //Bien luu tru ket qua
public MathImpl() //constructor
{
super("Simple MathService"); //Goi constructor cua cha }
public void add(int a) throws RemoteException
{
value = value + a; }
public void subtract(int a) throws RemoteException
{
value = value - a; }
public int getValue() throws RemoteException
{
return value; }
}
Lưu ý :
+ Lớp MathImpl kế thừa từ lớp GridServiceImpl, lớp GridServiceImpl cài đặt tất cả các phương thức được khai báo trong portType GridService theo định nghĩa của OGSI.
+ Interface của chúng ta có tên là MathPortType, được khai báo trong phần portType của file GWSDL.