JNDI và dịch vụ COS Naming của CORBA:

Một phần của tài liệu Tổng quan về Corba (Trang 39)

6. Dịch vụ quản lý tên COS NAMING của CORBA: 1 Tìm hiểu về JND

6.2. JNDI và dịch vụ COS Naming của CORBA:

Dựa vào đặc tả JNDI của Java, Corba xây dựng một cơ chế lưu trữ tên và tham chiếu của đối tượng.

Corba phân ra khái niệm NamingContext và NamingComponent tương tự như khái niệm file và thư mục mà ta vẫn quen thuộc.

NamingContext là một đối tượng có khả năng dẫn tham chiếu đến

NamingComponent hay NamingContext khác (NamingContext đóng vai trò như một thư mục). NamingContext được đặt tên dựa vào NamingComponent.

NamingComponent là một thành phần chứa tên (tương tự nhãn hoặc tên file) có khả năng ràng buộc tên với một đối tượng bất kỳ nào đó (đối tượng này phải là đối tượng Corba).

NamingComponent và NamingContext quan hệ với nhau theo cấu trúc hình cây tương tự cấu trúc cây thư mục của hệ thống file trên đĩa. Hình 10 là một ví dụ về cách lưu trữ của dịch vụ COS Naming trong Corba. Dịch vụ này chính là chương trình tnameserv.exe mà ta sẽ có dịp tìm hiểu qua khi cài đặt chương trình.

Hình10. Mô hình ràng buộc và lưu trữ đối tượng của dịch vụ COS Naming

Như ta đã thấy ở hình 10, Market là một đối tượng NamingContext. Nó cho phép bạn tìm ra 3 thành phần tên: Stock, Shefl và Panel. Bản thân Stock, Shelf là hai NamingContext. Stock chứa 2 thành phần mang tên Toys và Fruit. Shelf chứa một thành phần mang tên Book. Đối tượng Object A được ràng buộc với tên Toys trong khi đối tượng Object B, Object C được ràng buộc bởi tên Fruit và Book. Một đối tượng không chỉ được ràng buộc bởi một tên mà có thể nhiều tên. Ví dụ cả Panel và Book cùng ám chỉ đến đối tượng Object C. Điều này tương tựh như trong Windows, một tập tin trên đĩa có thể được tham chiếu đến bằng nhiều

Đối tượng NameContext

Panel Book Market Stock Shelf Toys Fruit NameContext NameComponent Object A Object B Object C

Đối tượng NameCoponent Tên ràng buộc của đối tượng

shortcut hay trong Unix/Linux, một tập tin vật lý có thể được tham chiếu bằng nhiều link khác nhau.

Bây giờ ta thử hình dung COS Naming là một cây thư mục. Nếu đứng từ Market để tham chiếu đến đối tượng Object A ta phải chỉ đường dẫn như sau:

Market\Stock\Toys. Muốn tham chiếu đến Object C, ta chỉ đường dẫn

Market\Panel hoặc Market\Shelf\Book. Tuy nhiên nếu ta đang đứng ở vị trí Stock ta chỉ cần tham chiếu đến đối tượng Objetc A theo cách Stock\toys là đủ. Đó chính là khái niệm ngữ cảnh (context) mà ta sẽ gặp trong dịch vụ COS Naming của CORBA. Đối với một đối tượng, tùy theo cntext khác nhau mà ta có thể truy xuất theo tên của đối tượng khác nhau.

7.Các dịch vụ khác CORBA

Một phần quan trọng của chuẩn CORBA đó là định nghĩa một tập các dịch vụ phân tán để cung cấp sự tích hợp và sự tương tác của các đối tượng phân tán. Như mô tả trong hình dưới đây, được biết đến như là các CORBA sevices hay COS, được định nghĩa đầu của ORB. Có nghĩa là, chúng được xác định như là các đối tượng CORBA chuẩn với các giao tiếp IDL, đôi lúc được xem đến như là “các dịch vụ đối tượng” (Object Services).

Hình 10 : Kiến trúc COS.

Có một số dịch vụ CORBA. Dưới đây ta liệt kê sơ qua về chúng:

Dịch vụ Mô tả

Chu kì vòng đời đối tượng (Object life cycle)

Định nghĩa một đối tượng CORBA được tạo ra, xoá, di chuyển, và sao chép như thế nào

Naming Xác định việc đặt các tên cho các đối tượng CORBA

Relationships Cung cấp các quan hệ n-ary định dạng ngẫu nhiên giữa các đối tượng CORBA.

Externalization Định toạ độ các di chuyển của các đối tượng CORBA và từ phương tiện truyền thông bên ngoài. Transactions Định toạ độ các nguyên tử truy nhập đến các đối

tượng CORBA.

Concurrency Control Cung cấp dịch vụ khoá cho các đối tượng CORBA để có được một sự truy nhập tuần tự

Property Hỗ trợ liên kết giữa các cặp name-value với các đối tượng CORBA

Trader Hỗ trợ việc tìm kiếm của đối tượng CORBA dựa trên các thuộc tính miêu tả dịch vụ được cung cấp bởi đối tượng.

Query Hỗ trợ truy vấn trên các đối tượng

8.Các sản phẩm của CORBA

CORBA là một đặc tả. Nó là một hướng dẫn để thực thi các sản phẩm. Một số nhà cung cấp bán các sản phẩm CORBA được viết bằng các ngôn ngữ khác nhau. Các sản phẩm CORBA hỗ trợ ngôn ngữ lập trình Java bao gồm :

ORB Mô tả

Java 2 ORB Java 2 ORB kết hợp cùng với Sun’s Java 2 SDK. Nó thiếu một số đặc tính.

VisiBroker cho Java Một ORB Java thông dụng của Insprise Corporation. VisiBroker cũng được nhúng trong các sản phẩm khác. Ví dụ, nó là ORB được nhúng trong trình duyệt Netscape Communicator.

OrbixWeb Một ORB Java thông dụng của Iona Technologies. WebSphere Một server ứng dụng thông dụng với một ORB của

Netscape

Communicator VisiBroker nhúng trong chúng. Các applet có thể đưaCác trình duyệt Netscape có một phiên bản của ra yêu cầu trên các đối tượng CORBA mà không cần tải các lớp ORB vào trình duyệt. Chúng đã có sẵn ở đó. Various free hoặc

shareware ORBs

Các thực thi CORBA đối với các ngôn ngữ khác nhau có sẵn để tải về trên các trang web từ các nguồn khác nhau.

Chương 3: Chương trình ứng dụng.

Trang Web nghe nhạc online

.a Mục đích của trang Web

- Minh họa cho việc lập trình web sử dụng CORBA trong Java

.b Kiến trúc hệ thống

Trình khách CORBA ở đây là một servlet. Mọi giao tiếp với servlet đều thông qua giao thức HTTP, do đó người sử dụng có thể sử dụng một trình duyệt web chuẩn không có giao thức IIOP để triệu gọi đến đối tượng từ xa. Servlet được thực hiện trên Web server sẽ nhận yêu cầu HTTP, sau đó tạo IIOP để triệu gọi đối tượng từ xa. Khi nó nhận được câu trả lời của IIOP, nó sẽ gửi câu trả lời HTTP tương ứng đến trình khách .

Ưu điểm của cơ cấu này là kiểu giao tiếp này không bị ngăn cản bởi các hàng rào an ninh. Thậm chí khi trình khách HTTP là một applet thì cũng không có một ngăn cấm nào với applet được áp dụng bởi vì giao tiếp là giao tiếp với Web server của applet. Hơn nữa, các yêu cầu HTTP được cho phép đi qua nhiều tường lửa. Servlet hoạt động như một cổng IIOP.

Web browser Web browser Corba Client Servle t Corba Client Servle t Web ServerWeb Server Corba Server Corba Server Data Data Invokes Invokes Loads Acesses

.c Tại sao lại sử dụng CORBA trong xây dựng chương trình?

Nội dung lưu trữ trong máy chủ: - Các file nhạc

- Cơ sở dữ liệu lưu trữ danh sách các bài hát, và đường dẫn của chúng - Các đối tượng để lấy về danh sách và nội dung file nhạc

Quá trình thực hiện như sau: Người sử dụng đăng nhập vào trang Web, là một trình khách Corba Servlet. Trình khách sẽ gửi yêu cầu triệu gọi đối tượng lấy danh sách bài hát đến trình chủ CORBA. Trình chủ CORBA thông qua Web Server sẽ gửi đối tượng mà trình khách cần đến trình khách. Danh sách các bài hát sẽ được hiển thị trên trang Web của người sử dụng. Người sử dụng sẽ chọn bài hát và gửi yêu cầu lấy nội dung của file nhạc này. Trình chủ CORBA sẽ tiếp tục gửi đối tượng file nhạc về cho trình khách. Trình khách sẽ thực hiện play file nhạc này.

Vậy làm cách nào để có thể triệu gọi đối tượng nhạc đến máy khách? Và khi mà máy chủ và máy khách sử dụng hai ngôn ngữ lập trình không giống nhau (ví dụ. máy chủ sử dụng ngôn ngữ C++, còn máy khách sử dụng ngôn ngữ Java), làm cách nào để tìm được tiếng nói chung giữa hai ngôn ngữ này? Đó chính là lý do mà ta chọn sử dụng CORBA trong ứng dụng. CORBA với mục đích sử dụng trong kỹ thuật lập trình phân tán và đáp ứng mong muốn tìm được tiếng nói chung cho tất cả các ngôn ngữ lập trình hiện có, hoàn toàn có thể đáp ứng được các yêu cầu trên.

.d Các bước xây dựng trang Web

-1 Đặc tả đối tượng CORBA bằng ngôn ngữ IDL

module song{

struct SongInfo{ long id;

string path; }; exception SQLError { wstring message; }; interface Song{

SongInfo getItem(in long id) raises (SQLError); boolean getNhactre();

boolean getPop();

};

interface FileInterface {

typedef sequence<octet> Data;

Data downloadFile(in string fileName); };

};

- Đối tượng SongInfo dùng để chứa các thông tin về một bài hát, bao gồm mã bài hát, tên bài hát, đường dẫn đến file nhạc.

- Đối tượng Song :

o Dùng để lấy về danh sách các bài hát thuộc thể loại nhạc trẻ, nhạc Pop, nhạc Rock ….

o Lấy về đối tượng bài hát được chọn

- Đối tượng FileInterface: dùng để tải file nhạc về máy khách

-2 Cài đặt đối tượng CORBA Song bằng ngôn ngữ Java

Với mục đích minh họa cho việc sử dụng CORBA trong Java nên ngôn ngữ lập trình được sử dụng trong trình khách và trình chủ ở đây đều được chọn là Java.

• Đối tượng SongManager kế thừa lớp SongPOA

}

• Tạo hàm setORB() kết nối đối tượng CORBA với trình môi giới ORB

private ORB orb;

public void setORB(ORB orb_val){ orb=orb_val;

}

• Tạo hàm getItem() lấy về đối tượng bài hát được chọn

public SongInfo getItem(int id) throws SQLError{

// Kết nối cơ sơ dữ liệu trên máy chủ

// Thực hiện truy vấn lấy về bài hát có mã bài hát tương ứng với mã bài hát được chọn

// Đối tượng được trả về có kiểu SongInfo

}

• Tạo hàm getPop() lấy về danh sách các bài thuộc thể loại nhạc Pop

public boolean getPop(){

// Kết nối cơ sở dữ liệu …

// Thực hiện truy vấn lấy về thông tin các bài hát thuộc thể loại nhạc Pop lưu vào đối tượng kiểu SongInfo

// Các đối tượng thu được được lưu vào file “t.tmp”

}

• Các hàm getNhactre(), getRock(), … cũng làm tương tự. -3 Cài đặt đối tượng CORBA FileInterface bằng ngôn ngữ Java

• Đối tượng FileServant kế thừa lớp FileInterfacePOA

}

• Tạo hàm setORB() kết nối đối tượng CORBA với trình môi giới ORB

private ORB orb;

public void setORB(ORB orb_val){ orb=orb_val;

}

• Tạo hàm downloadFile() để tải file nhạc từ máy chủ về. Nội dung của file nhạc tải về được lưu trong một mảng kiểu byte

public byte[] downloadFile(String fileName){ File file = new File(fileName);

byte buffer[] = new byte[(int)file.length()]; try {

BufferedInputStream input = new

BufferedInputStream(new FileInputStream(fileName)); input.read(buffer,0,buffer.length);

input.close(); } catch(Exception e) {

System.out.println("FileServant Error: "+e.getMessage()); e.printStackTrace();

}

return(buffer); }

-4 Viết trình cài đặt đối tượng CORBA trên máy chủ

public class SetupServer {

}

• Đầu tiên do CORBA cần đến trình môi giới trung gian ORB nên trình đăng ký phải khởi động môi trường này bằng lệnh

ORB orb=ORB.init(args,null);

• Thực hiện tham chiếu đến RootPOA và kích hoạt POAManager

CORBA trong đặc tả mới nhất muốn xây dựng mô hình khả chuyển (portable) cho các đối tượng bằng khái niệm POA (Portable Object Adaptor). POA là lớp chịu trách nhiệm quản lý và kích hoạt đối tượng theo yêu cầu của trình khách. ORB cung cấp cho bạn nhiều lớp POA. Tất cả các lớp POA con đều phải được tạo ra từ POA gốc (gọi là root POA).

POA

rootpoa=POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate();

• Tiếp đến đối tượng CORBA được tạo ra một cách bình thường

SongManager manager=new SongManager(); FileServant fileServant=new FileServant();

• Kết nối đối tượng với trình môi giới

manager.setORB(orb); fileServant.setORB(orb);

• Lấy về tham chiếu của dịch vụ tên

org.omg.CORBA.Object nameService =

orb.resolve_initial_references("NameService");

• Chuyển tham chiếu về đối tượng NamingContext

NamingContext nsContext=NamingContextHelper.narrow(nameService);

• Lấy tham chiếu đối tượng từ dịch vụ

org.omg.CORBA.Object ref1=rootpoa.servant_to_reference(manager); Song href1=SongHelper.narrow(ref1);

org.omg.CORBA.Object ref2=rootpoa.servant_to_reference(fileServant); FileInterface href2=FileInterfaceHelper.narrow(ref2);

• Tạo tên của đối tượng

NameComponent nc1=new NameComponent("SongManager",""); NameComponent nc2=new NameComponent("FileServant","");

• Tạo đường dẫn lưu tên đối tượng

NameComponent path2[]={nc2};

• Yêu cầu dịch vụ ràng buộc đối tượng theo tên

nsContext.rebind(path1,href1); nsContext.rebind(path2,href2);

• Chờ nhận yêu cầu từ máy khách

java.lang.Object obj=new java.lang.Object(); synchronized(obj){

obj.wait(); }

-5 Tạo applet nghe nhạc để nhúng vào trang Web

public class JMF extends Applet implements ControllerListener {

}

-6 Tạo trang Servlet index.java làm trang chủ

public class index extends HttpServlet {

public void doGet (HttpServletRequest request, HttpServletResponse response) { try {

PrintWriter out;

response.setContentType("text/html"); out = response.getWriter();

// đoạn tạo giao diện HTML

} catch (Exception e) { System.out.println(e); } }

}

-7 Tạo các trang link đến

• Servlet pop.java

// Hashtable dùng để lưu trữ danh sách các bài hát

private Hashtable songs=new Hashtable();

// Các đối tượng CORBA và NamingContext

NamingContext nsContext=null; NameComponent nc1=null; Song servant=null;

NameComponent nc2=null; FileInterface fileServant=null;

// Khởi tạo Servlet

public void init(ServletConfig config) throws ServletException {

// kết nối đối tượng CORBA với trình môi giới ORB

ORB orb = ORB.init(args, null);

// Lấy tham chiếu dịch vụ tên

org.omg.CORBA.Object nameService =

orb.resolve_initial_references("NameService");

nsContext = NamingContextHelper.narrow(nameService);

// Tạo tên đối tượng

nc1=new NameComponent("SongManager",""); nc2=new NameComponent("FileServant",""); } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } }

public void doGet (HttpServletRequest request, HttpServletResponse response){

// Lấy tham chiếu đối tượng CORBA trên máy chủ

servant=SongHelper.narrow(nsContext.resolve(path1)); NameComponent path2[]={nc2};

fileServant=FileInterfaceHelper.narrow(nsContext.resolve(path2));

// Đọc nội dung file t.tmp trên máy chủ tải về máy khách, lưu vào file t1.tmp

// Lấy nội dung file t1.tmp cho vào hashtable. …

// Hiển thị giao diện HTML …

// Lấy nội dung hashtable cho vào list

for (Enumeration e = getSongs(songs); e.hasMoreElements(); ){ SongInfo song=(SongInfo)e.nextElement(); out.print("<OPTION VALUE="+song.id+">"+song.tittle); } } }

• Các servlet tương ứng với các thể loại nhạc khác cũng làm tương tự • Servlet play.java để play bài hát được chọn

public class play extends HttpServlet {

// Các đối tượng CORBA và NamingContext

NamingContext nsContext=null; NameComponent nc1=null; Song servant=null;

NameComponent nc2=null; FileInterface fileServant=null;

// Khởi tạo Servlet

public void init(ServletConfig config) throws ServletException {

ORB orb = ORB.init(args, null);

// Lấy tham chiếu dịch vụ tên

org.omg.CORBA.Object nameService =

orb.resolve_initial_references("NameService");

nsContext = NamingContextHelper.narrow(nameService);

// Tạo tên đối tượng

nc1=new NameComponent("SongManager",""); nc2=new NameComponent("FileServant",""); } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } }

public void doPost (HttpServletRequest request, HttpServletResponse response) {

// Lấy tham chiếu đối tượng CORBA trên máy chủ

NameComponent path1[]={nc1};

servant=SongHelper.narrow(nsContext.resolve(path1)); NameComponent path2[]={nc2};

fileServant=FileInterfaceHelper.narrow(nsContext.resolve(path2));

// Lấy nội dung list box được chọn ở trang trước

String song=request.getParameter("list_song"); int id=Integer.parseInt(song);

// Truy vấn lấy thông tin bài hát được chọn

try{songSelected=servant.getItem(id);} catch(SQLError e){};

// Từ đường dẫn bài hát, tải bài hát về máy khách

try{

byte data[] = fileServant.downloadFile(songSelected.path); BufferedOutputStream output = new

BufferedOutputStream(new FileOutputStream("temp.mp3")); output.write(data, 0, data.length); output.flush(); output.close(); } catch(Exception e){ System.err.println("Error: "+e); e.printStackTrace(System.out); }

// Tạo giao diện HTML …

// Gọi đến applet play nhạc …

} }

.e Giao diện trang Web

Một phần của tài liệu Tổng quan về Corba (Trang 39)

Tải bản đầy đủ (DOC)

(58 trang)
w