Đề tài Thi hành CORBA server

MỤC LỤC

 

Trang

LỜI NÓI ĐẦU 1

I. ÁNH XẠ TỪ IDL SANG C++ 2

1. Giới thiệu 2

2. Ánh xạ cho tên 2

3. Ánh xạ các kiểu dữ liệu cơ bản 3

4. Ánh xạ các kiểu dữ liệu phức 3

 

II. ÁNH XẠ PHÍA SERVER 16

 

1 . Mở đầu 16

2 . ánh xạ các giao tiếp 16

3. Các lớp servant 17

4. Hình thành đối tượng 19

5. Server main 20

6. Quy tắc chuyền tham số 21

6.1. Truyền tham số kiểu đơn giản. 22

6.2 Truyền tham số đối với kiểu dữ liệu phức tạp có độ dài cố định. 23

6.3 Truyền tham số mảng với số phần tử cố định 24

6.4 Truyền tham số string và wide string 26

6.5 Truyền tham số kiểu phức tạp có độ dài thay đổi và kiểu any 28

6.6 Truyền tham số mảng với các thành phần có độ dài thay đổi 29

6.7 Truyền tham số tham chiếu đối tượng 31

7. Phát sinh ngoại lệ 34

7.1 Phát sinh các ngoại lệ. 34

7.2 Các ngoại lệ hệ thống 35

7.3 Quản lí bộ nhớ và ngoại lệ 35

8. Tie classes 35

9 . Tổng kết 36

 

MỤC LỤC 37

 

 

doc37 trang | Chia sẻ: maiphuongdc | Lượt xem: 1658 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đề tài Thi hành CORBA server, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
_raise (); ID BadId; }; }; Các thuộc tính của lớp Exception là public vì vậy bạn có thể truy nhập trực tiếp. Ánh xạ các các bộ phận Các bộ phận của lớp ngoại lệ được ánh xạ theo cách tương tự như các cấu trúc. Tất cả các bộ phận của ngoại lệ là dữ liệu công cộng trong lớp của C++, và được truy nhập trực tiếp. Var Một lớp _var được sinh ra cho một ngoại lệ. Out Một lớp Out được sinh ra cho một ngoại lệ. Các hàm bộ phận Với ngoại lệ của IDL là TYPE có các hàm bộ phận sau: static TYPE * _narrow(CORBA::Exception_ptr Except); TYPE(); Đây là constructor mặc định cho ngoại lệ TYPE(các tham chiếu bộ phận); TYPE (const TYPE & From); ~TYPE (); TYPE & operator=(const TYPE & From); void _raise (); * Quản lý các giao diện (interface) Một giao diện trong IDL được ánh xạ sang một lớp của C++. Lớp này chứa các định nghĩa của các thao tác, các thuộc tính, các hằng, và các kiểu người dùng định nghĩa (UDTs). Với một giao diện INTF, đoạn mã giao diện được sinh ra chứa các phần sau: Kiểu tham chiếu đối tượng (INTF_ptr) Kiểu biến tham chiếu đối tượng (INTF_var) Hàm bộ phận tĩnh _duplicate Hàm bộ phận tĩnh _narrow Hàm bộ phận tĩnh _nil UDTs Các hàm bộ phận về các thuộc tính và các thao tác Xét ví dụ sau: // OMG IDL module INVENT { interface Order { void cancelOrder (); }; }; Ánh xạ sang C++ như sau: // C++ class INVENT { . . . class Order; typedef Order * Order_ptr; class Order : public virtual CORBA::Object { . . . static Order_ptr _duplicate(Order_ptr obj); static Order_ptr _narrow(CORBA::Object_ptr obj); static Order_ptr _nil(); virtual void cancelOrder () = 0; . . . }; }; Các kiểu tham chiếu đối tượng và các hàm bộ phận được mô tả như sau: static INTF_ptr _duplicate (INTF_ptr Obj) Hàm bộ phận tĩnh này sao chép một tham chiếu đối tượng INTF đang tồn tại và trả lại một tham chiếu đối tượng INTF mới. Tham chiếu đối tượng INTF mới phải được giải phóng bằng việc gọi hamf bộ phận CORBA::realease. Nếu một lỗi xuất hiện thì một tham chiếu tới đối tượng INTF nil được trả lại. Đối số Obj xác định tham chiếu đối tượng được sao chép. static INTF_ptr _narrow (CORBA::Object_ptr Obj) Hàm bộ phận tĩnh này trả lại một tham chiếu đối tượng INTF mới dựa vào một tham chiếu đối tượng CORBA::Object_ptr đang tồn tại. Tham chiếu đối tượng Obiect_ptr có thể được khởi tạo bằng việc gọi hàm bộ phận CORBA::ORB::string_to_object hoặc có thể được trả lại như một tham chiếu từ một thao tác. Tham chiếu đối tượng INTF_ptr phải tương ứng với một đối tượng INTF hoặc tương ứng với một đối tượng mà kế thừa từ đối tượng INTF. Tham chiếu đối tượng INTF mới phải được giải phóng bằng việc gọi hàm bộ phận CORBA::release. Đối số Obj xác định tham chiếu đối tượng để thu hẹp tới một tham chiếu đối tượng INTF. Tham biến Obj không bị thay đổi bởi các hàm bộ phận này và nên đựoc giải phóng bởi người sử dụng khi nó không được sử dụng nữa. Nếu Obj không được thu hẹp tới một tham chiếu đối tượng INTF thì một tham chiếu đối tượng INTF nil được trả lại. static INTF_ptr _nil ( ) Hàm bộ phận static này trả lại một tham chiếu đối tượng nil mới cho giao diện INTF. Tham chiếu mới không phải được giải phóng bằng cách gọi hàm bộ phận CORBA::release. Các kiểu tham chiếu đối tượng Một lớp giao diện (INTF) là một lớp ảo; CORBA chuẩn không cho phép bạn: Khởi tạo hay hold một instance của lớp giao diện. Sử dụng một con trỏ hay một tham chiếu tới một lớp giao diện. Thay vì đó bạn có thể sử dụng một kiểu tham chiếu đối tượng: lớp INTF_ptr hay INTF_var. Bạn có thể giành được tham chiếu đối tượng bằng việc sử dụng hàm bộ phận static _nrrow. Các thao tác truy nhập trên các lớp này thì sử dụng toán tử -> Lớp _var của INTF đơn giản hoá việc quản lý bộ nhớ bằng việc huỷ tự động tham chiếu đối tượng khi lớp _var của INTF nằm ngoài phạm vi được cấp phát lại. Các thuộc tính Một thuộc tính chỉ đọc trong OMG IDL được ánh xạ sang một hàm C++ mà hàm đó trả lại giá trị thuộc tính. Một thuộc tính đọc-ghi ánh xạ sang hai hàm C++ được chòng hàm, một hàm trả lại giá trị thuộc tính và một hàm trả lại tập giá trị thuộc tính. Tên của hàm bộ phận được chồng hàm là tên của thuộc tính. Các thuộc tính được tạo ra theo cách tương tự mà các hàm được tạo ra. II. ¸nh x¹ phÝa server Trong phÇn nµy chóng ta sÏ xem c¸ch mµ c¸c giao tiÕp IDL ¸nh x¹ sang c¸c líp C++ cïng víi sù hç trî viÖc t¹o vµ gäi ®èi t­îng CORBA ë bªn phÝa server vµ mét sè vÊn ®Ò liªn quan kh¸c . 1 . Më ®Çu : Trong m« h×nh CORBA c¸c ®èi t­îng server thùc hiÖn bëi øng dông server.T¹i server, ®èi t­îng CORBA ®­îc thùc thi vµ thÓ hÞªn bëi c¸c hµm ng«n ng÷ lËp tr×nh vµ d÷ liÖu. C¸c thùc thÓ ng«n ng÷ lËp tr×nh thùc thi vµ thÓ hiÖn c¸c ®èi t­îng CORBA ®­îc gäi lµ c¸c servant. C¸c servant cung cÊp c¸c phÇn th©n cña ®èi t­îng CORBA, hay nãi c¸ch kh¸c chóng lµ thÓ hiÖn cña c¸c ®èi t­îng CORBA. Trong CORBA c¸c bé ®iÒu hîp ®èi t­îng(object adapter ) liªn kÕt c¸c ®èi t­îng CORBA víi c¸c servant cña ng«n ng÷ lËp tr×nh. VÒ kh¸i niÖm th× bé ®iÒu hîp ®èi t­îng lµm trung gian gi÷a ORB vµ c¸c servant cña ng«n ng÷ lËp tr×nh. Chóng cung cÊp c¸c dÞch vô ®Ó t¹o c¸c ®èi t­îng CORBA, tham chiÕu lªn c¸c ®èi t­îng ®ã vµ göi yªu cÇu tõ c¸c servant t­¬ng øng. Bé ®iÒu hîp ®èi t­îng chuÈn ®Þnh nghÜa trong CORBA lµ POA (Portable Object Adapter ) nã cung cÊp c¸c ®Æc tr­ng cÇn thiÕt ®Ó kÝch ho¹t c¸c servant, ®Ó cã thÓ thÝch øng víi c¸c lo¹i ORB ®­îc cung cÊp bëi nhiÒu h·ng kh¸c nhau. Trong khi BOA ( Basic Object Adapter) còng lµ mét bé ®iÒu hîp ®èi t­îng nh­ng nã g¾n víi tõng lo¹i ORB cña h·ng cung cÊp nã. D­íi ®©y ta chØ xÐt POA . POA Manager ORB POA Servants Yªu cÇu øng dông Server Mèi quan hÖ gi÷a ORB, POA vµ c¸c servant Mét øng dông server cã thÓ chøa nhiÒu thÓ hiÖn POA ®Ó hç trî c¸c ®èi t­îng CORBA víi c¸c ®Æc tÝnh kh¸c nhau ,hoÆc hç trî nhiÒu d¹ng thùc thi servant . Tuy nhiªn tÊt c¶ c¸c øng dông server ®Òu cã Ýt nhÊt mét POA gäi lµ Root POA . D­íi ®©y ta chØ giíi thiÖu c¸ch sö dông c¬ b¶n cña Root POA cÇn thiÕt cho viÖc gi¶i thÝch ¸nh x¹ C++ phÝa server : C¸c yªu cÇu ®èi t­îng CORBA ®­îc c­ tró trong mét øng dông server ®­îc göi ®i tõ mét Client vµ chuyÓn ®Õn mét server ORB . Server ORB nµy sÏ gøi c¸c yªu cÇu tíi mét POA mµ t¹i ®ã ®èi t­îng ®­îc t¹o . POA lóc ®ã göi yªu cÇu tíi servant vµ t¹o ra ®èi t­îng ®Ých . Servant thùc hiÖn c¸c yªu cÇu vµ tr¶ vÒ kÕt qu¶ qua POA vµ ORB tíi client . Server kh«ng thÓ chÊp nhËn bÊt k× yªu cÇu nµo cho ®Õn khi nã yªu cÇu ORB cña nã b¾t ®Çu l¾ng nghe c¸c yªu cÇu ®­îc göi tíi . Mét øng dông server cã thÓ cã nhiÒu POA , dßng yªu cÇu ®i vµo mçi POA ®­îc ®iÒu khiÓn bëi mét ®èi t­îng POA Manager g¾n víi POA ®ã . §Ó yªu cÇu tíi ®­îc POA POA Mangager cã thÓ xÕp hµng c¸c yªu cÇu vµ göi sau hoÆc cã thÓ huû bá c¸c yªu cÇu. Cuèi cïng mçi yªu cÇu CORBA nhËn bëi øng dông server ph¶i ®­îc xö lý bëi mét servant. Chøc n¨ng chÝnh cña ¸nh x¹ C++ phÝa server lµ ®Ó cho phÐp c¸c øng dông thi hµnh c¸c ®èi t­îng CORBA sö dông ®èi t­îng C++ trong vai trß cña c¸c servant . C¸c líp C++ phÝa server t­¬ng øng víi c¸c giao tiÕp IDL ®­îc gäi lµ líp Skeleton . Chóng t­¬ng øng víi c¸c líp proxy phÝa client vµ ®­îc sinh bëi bé dÞch IDL sang file nguån C++ , råi ®­îc dÞch trong øng dông server . Kh«ng nh­ c¸c líp proxy phÝa client c¸c líp skeleton ®­îc më réng ®Ó phôc vô d­íi vai trß lµ líp c¬ së cho c¸c líp cô thÓ cña øng dông server . Tõ viÖc dÉn xuÊt c¸c líp servant tõ c¸c líp skeleton ®ã , øng dông server ®­îc më réng vµ hoµn tÊt khung skeleton , cho phÐp thiÕt lËp vµ h×nh thµnh c¸c ®èi t­îng CORBA. ¸nh x¹ c¸c giao tiÕp ¸nh x¹ C++ phÝa server sinh ra mét líp skeleton riªng cho tõng giao tiÕp IDL . T­¬ng tù nh­ c¸ch mµ tr×nh dÞch IDL sinh ra c¸c file header ®Ó include vµo phÝa client . Tr×nh dÞch IDL th­êng sinh c¸c file header chøa c¸c ®Þnh nghÜa líp skeleton . Tªn vµ néi dung cña nh÷ng file sinh ra lµ kh¸c nhau tuú thuéc vµo c¸c nhµ triÓn khai ORB nh­ng nãi chung mét tr×nh dÞch IDL sinh ra c¶ file header vµ file thùc thi . Nghiªn cøu mét giao tiÕp ®¬n gi¶n d­íi ®©y: interface MyObject { long get_value(); }; File header ph¸t sinh chøa ®Þnh nghÜa líp skeleton nh­ sau : Class POA_MyObject public : public virtual PortableServer :: ServantBase { public : virtual CORBA::Long get_value() throw (CORBA::SystemException ) = 0 // . . . } ; Mét sè ®iÓm cÇn ph¶i chó ý: Tªn cña líp skeleton ®­îc sinh POA_MyObject phï hîp víi tªn MyObject trong giao tiÕp IDL ngo¹i trõ tiÒn tè POA_ . TiÒn tè POA_ ®­îc dïng ®Ó ph©n biÖt c¸c tªn cña c¸c líp C++ ®­îc sinh phÝa server víi c¸c tªn phÝa client . Sù ph©n biÖt namespace nµy lµ quan träng v× hÇu hÕt c¸c øng dông CORBA ch¹y kh«ng b×nh th­êng ®Òu lµ do c¶ phÝa server víi c¸c ®èi t­îng cña nã vµ client víi c¸c ®èi t­îng kh¸c . Ngoµi sù kh¸c biÖt trong tªn viÖc cè g¾ng link c¸c líp C++ phÝa client vµ phÝa server trong cïng mét øng dông dÉn ®Õn lçi thêi gian kÕt nèi ( link time-error ) bëi viÖc ®Þnh nghÜa l¹i c¸c tªn . Chó ý lµ tiÒn tè POA_ n»m ë ngoµi cïng . VÝ dô nÕu MyObject ®­îc ®Þnh nghÜa trong modul Mod th× tªn ®Çy ®ñ cña nã ®­îc sinh trong líp skeleton lµ: POA_Mod :: MyObject. Líp skeleton kÕ thõa tõ Portable :: ServantBase lµ líp c¬ së chung cho tÊt c¶ c¸c líp skeleton Líp skeleton cung cÊp ph­¬ng thøc get_value t­¬ng øng víi ph­¬ng thøc ®­îc ®Þnh nghÜa trong IDL . get_value ®­îc khai b¸o thuÇn ¶o (pure virtual) v× vËy líp skeleton POA_MyObject lµ mét líp c¬ së trõu t­îng kh«ng thÓ ®­îc thùc hiÖn . get_value bao gåm viÖc chØ ®Þnh mét ngo¹i lÖ mµ nã giíi h¹n kiÓu ngo¹i lÖ C++ ®­îc nÐm hîp lÖ. ViÖc chØ râ ngo¹i lÖ ®­îc sinh cho ph­¬ng thøc phÝa server chèng l¹i ph­¬ng thøc ®­îc khai b¸o trong c¸c l¬p proxy phÝa client mµ ë ®ã viÖc chØ ®Þnh ngo¹i lÖ lµ tïy chän TÊt c¶ c¸c ph­¬ng thøc cµi ®Æt ph­¬ng thøc IDL cã thÓ nÐm c¸c ngo¹i lÖ hÖ thèng CORBA ( CORBA system exception ) , ®iÒu nµy cã nghÜa líp c¬ së CORBA :: SystemException ®­îc include trong tÊt c¶ c¸c chØ ®Þnh ngo¹i lÖ cña líp skeleton . 3. C¸c líp servant §Ó t¹o ra mét ®èi t­îng CORBA kiÓu MyObject, b¹n ph¶i dÉn xuÊt mét líp servant tõ líp POA_MyObject vµ cµi ®Æt tÊt c¶ c¸c ph­¬ng thøc thuÇn ¶o. Xem vÝ dô cña líp servant d­íi ®©y. #include “my_object.hh” class MyObject_impl:public virtual POA_MyObject{ public: MyObject_impl(CORBA::long init_var):m_value(init_var){} Virtual CORBA::long get_value () throw (CORBA:System Exception); Private: CORBA::long m_value; MyObject_impl(const MyObject_impl &); Void operator=(const MyObject_imple &); }; Cã vµi ®IÓm quan träng cÇn l­u ý vÒ líp servant trªn: Gi¶ sö ch­¬ng tr×nh dïng tr×nh dÞch IDL ®Ó dÞch file My_object.idl trong ®ã cã chøa ®Þnh nghÜa IDL cña giao tiÕp MyObject. §Ó s¶n sinh ra file header phÝa server: My_object.hh (tªn cña file header kh«ng ®­îc tiªu chuÈn ho¸, v× vËy tªn chÝnh x¸c sÏ thay ®æi theo tr×nh dÞch IDL b¹n dïng). Ch­¬ng tr×nh include file header nµy ®Ó thu ®­îc khai b¸o cho líp c¬ së POA_Object. Tªn ®­îc chän cho líp servant MyObject_impl phô thuéc hoµn toµn vµo øng dông. Nã cã thÓ lµ bÊt cø tªn g×, miÔn lµ nã kh«ng xung ®ét víi bÊt cø tªn nµo ®­îc khai b¸o tr­íc bëi ¸nh x¹ C++, nh­ nh÷ng tªn ®­îc b¾t ®Çu víi POA_. Theo quy ­íc ®Æt tªn cho c¸c líp servant víi c¸c hËu tè _impl sao cho chóng ta cã thÓ biÕt ®­îc ®ã lµ c¸c líp servant khi nh×n vµo tªn cña líp. Líp MyObject_Impl thõa kÕ tù líp skeleton POA_myObject vµ n¹p chång hµm thuÇn ¶o get_value lµm cho MyObject mét líp cô thÓ cã thÓ thùc hiÖn. B¹n b¾t buéc ph¶i cÇn tÊt c¶ c¸c hµm thuÇn ¶o ®­îc thõa kÕ trong líp servant bëi v× tr×nh dÞch C++ sÏ kh«ng cho phÐp t¹o c¸c thÓ hiÖn cña nã. Trõ ra r»ng b¹n cã thÓ thªm bÊt cø g× kh¸c b¹n thÊy h÷u Ých ®Ó hç trî viÖc thi hµnh líp servant cña b¹n. VD: b¹n muèn thªm constuctor vµ destructor , thªm hµm thµnh phÇn hoÆc d÷ liÖu thµnh phÇn. B¹n còng cã thÓ thªm phÇn protected hoÆc private. §èi víi vÝ dô trªn chóng ta ®· thªm mét thµnh phÇn d÷ liÖu private lµ m_value cã kiÓu lµ CORBA:: long vµ mét constructor khëi t¹o thµnh phÇn ®ã. Ch­¬ng tr×nh còng ®· t¹o c¸c constructor sao chÐp vµ to¸n tö g¸n mÆc ®Þnh private. B»ng c¸ch Êy kh«ng cho phÐp sao chÐp servant cña chóng ta. Thùc tÕ hiÕm khi cÇn cã constructor sao chÐp hoÆc g¸n servant, v× vËy nªn Èn c¸c constructor sao chÐp vµ c¸c khai b¸o mÆc ®Þnh cho c¸c líp servant. ViÖc thùc thi ph­¬ng thøc get_value ®¬n gi¶n lµ tr¶ vÒ gi¸ trÞ m_value. ViÖc thùc thi hµm get_value qu¸ ®¬n gi¶n ®Õn nçi kh«ng cã ®iÒu khiÓn lçi cã thÓ x¶y ra,v× vËy kh«ng ph¶i nÐn bÊt k× ngo¹i lÖ nµo. Bëi v× c¸c servant cña ch­¬ng tr×nh thõa kÕ c¸c hµm ¶o, nã ph¶i ®­îc khai b¸o l¹i c¸c hµm chÝnh x¸c nh­ chóng ®­îc khai b¸o trong líp c¬ së skeleton ph¸t sinh, bao gåm tÊt c¶ c¸c chØ ®Þnh ngo¹i lÖ. H¬n thÕ n÷a c¸c tªn hµm, c¸c ký hiÖu vµ chØ ®Þnh ngo¹i lÖ cho viÖc ®Þnh nghÜa thùc thi servant ph¶I phï hîp chÝnh x¸c víi khai b¸o t­¬ng øng. Nõu cã sù kh«ng phï hîp chóng hÇu nh­ cã thÓ Èn, h¬n thÕ n÷a lµ ®Þnh nghÜa chång, thao t¸c skeleton thõa kÕ. §iÒu nµy cã nghÜa líp servant thõa kÕ c¸c hµm thuÇn ¶o vµ bëi vËy sÏ kh«ng cô thÓ. Cã ®­îc nh÷ng khai b¸o vµ ®Þnh nghÜa nµy chÝnh x¸c cã thÓ lµ ®èi t­îng sai, v× vËy nhiÒu ch×nh dÞch IDL include c¸c option. Nõu tr×nh dÞch IDL cña b¹n hç trî ®Æc tÝnh ®ã, th× b¹n nªn sö dông nã khi viÕt c¸c líp servant cña b¹n. nÕu thiÕu ®Æc tÝnh nµy b¹n nªn cut vµ Paste khai b¸o ph­¬ng thøc víi viÖc thùc thi tõ c¸c file ®­îc sinh phÝa server ®Ó tr¸nh lçi. Líp myObject kh¸ ®¬n gi¶n vµ ch­a ®Çy ®ñ. ThÓ hiÖn cña nã lµ ®Çy ®ñ kh¶ n¨ng cña viÖc h×nh thµnh ®èi t­îng CORBA kiÓu MyObject. 4. H×nh thành ®èi t­îng §Ó sö dông thÓ hiÖn cña líp servant MyObject_Impl ®Ó t¹o mét ®èi t­îng CORBA, b¹n ph¶I t¹o mét servant MyObject_Impl trong khi h×nh thµnh ®èi t­îng CORBA. Chó ý r»ng viÖc t¹o mét servant C++ kh«ng hµm ý viÖc t¹o mét ®èi t­îng CORBA, mçi thùc thÓ cña chóng cã nh÷ng ®Ióm riªng vµ vßng ®êi riªng biÖt. §Ó ®¬n gi¶n vÝ dô sau sÏ chØ râ c¸ch dÔ nhÊt ®Ó t¹o mét servant C++ vµ t¹o lËp mét ®èi t­îng CORBA míi b»ng servant ®ã. // ®Çu tiªn t¹o mét thÓ hiÖn servant MyObject_impl servant(42); // tiÕp theo t¹o ®èi t­îng CORBA vµ sö dông servant míi t¹o MyObject_var object= servant_this(); Dßng ®Çu cña ®o¹n code t¹o mét thÓ hiÖn servant vµ thiÕt lËp gi¸ trÞ cña nã lµ 42. ë ®iÓm nµy tÊt c¶ nh÷ng g× ch­¬ng tr×nh cÇn cã lµ mét ®èi t­îng C++ kh«ng kÕt nèi gi÷a servant vµ bÊt k× mét ®èi t­îng CORBA ®· ®­îc t¹o. Dßng hai ®o¹n m· lµ lêi gäi hµm _this cña servant,nã thøc hiÖn c¸c b­íc sau: T¹o mét ®èi t­îng CORBA d­íi root POA. §¨ng kÝ servant cïng víi root POA khi thùc thi cho ®èi t­îng míi. T¹o mét tham chiÕu ®èi t­îng cho ®èi t­îng míi. Tr¶ vÒ tham chiÕu ®èi t­îng. Hµm _this ®­îc cung cÊp bëi líp skeleton ®o¹n m· d­íi sÏ cho biÕt líp POA_MyObject ®­îc sinh. Cho bÊt k× líp skeleton POA_A miªu t¶ giao tiÕp IDL. Vµ gi¸ trÞ tr¶ vÒ cña hµm POA_A::_this lµ A_ptr, kiÓu tham chiÕu ®èi t­îng C++ cho giao tiÕp A. theo vÝ dô tr­íc kiÓu tr¶ vÒ cña hµm this lµ MyObject_ptr. Bëi v× lêi gäi hµm _this chÞu tr¸ch nhiÖm ®¶m b¶o CORBA::release cuèi cïng ®­îc gäi kiÓu tham chiÕu ®èi t­îng ®­îc tr¶ vÒ chóng ta ®· g¸n gi¸ trÞ tr¶ vÒ cho biÕn MyObject_var. Trong vÝ dô trªn ®èi t­îng CORBA ®­îc t¹o bëi hµm _this lµ mét ®èi t­îng tån t¹i ng¾n ngñi. §èi t­îng CORBA tån t¹i ng¾n ngñi bëi v× nã rµng buéc víi thêi gian tån t¹i cña POA mµ trong ®ã nã ®­îc t¹o ra. Tuy nhiªn hµm _this cã thÓ cung cÊp c¸ch thøc t¹o khu«n d¹ng nµy cña viÖc dÞch vô ®¨ng kÝ nÕu POA cña servant ®­îc t¹o víi c¸ch thøc hîp lý. TËp chuÈn cña c¸ch thøc ®­îc hç trî bëi root POA ®­îc thiÕt kÕ râ rµng ®Ó cho phÐp hµm _this ®­îc sö dông theo kiÓu nµy. 5. Server main §Ó hoµn tÊt øng dông server ®¬n gi¶n cña ch­¬ng tr×nh, ch­¬ng tr×nh ph¶i cung cÊp mét hµm main nh­ sau: #include “my_objects.hh” #include “iostream.h” int main(int argc, char *args[]) { // khëi t¹o ORB CORBA::ORB_var orb=CORBA::ORB_init(argc, argv); // LÊy tham chiÕu ®Õn Root POA CORBA::Object_var obj = orb->resolve_inittial_references(“Root POA”); Portable Server::POA_var poa=PortableServer::POA::_narrow(obj); // KÝch ho¹t manager cña POA Portable Server::Manager_var mgr=poa->the_POAmanager(); Mrg=activeti(); // T¹o servant MyObject vµ sau ®ã t¹o ngÇm mét ®èi t­îng CORBA vµ khëi // t¹o nã víi servant MyObject_impl servant(42); MyObject_var object = servant_this(); // ChuyÓn ®æi tham chiÕu ®èi t­îng sang d¹ng x©u vµ ®­a ra thiÕt bÞ chuÈn CORBA::String_var str = orb->object_tc_string(object); Cout<<str<<edl; // Cho phÐp ORB b¾t ®Çu xö lý yªu cÇu. Orb->run(); Return 0 } Hµm Main Server ho¹t ®éng nh­ sau: Khëi t¹o ORB qua lêi gäi hµm chuÈn CORBA::ORB_init. Sö dông tham chiÕu ORB tr¶ vÒ qua lêi gäi ORB_init ®Ó gäi resolve_initial_references cho phÐp thu ®­îc ®­îc tham chiÕu tõ c¸c giao tiÕp. Ch­¬ng tr×nh sÏ sö dông nã ®Ó nhËn ®­îc tham chiÕu tíi root POA cho ORB, ®ång thêi còng ®Ó nhËn tham chiÕu ®Õn POA Manager cho Root POA. KÝch ho¹t POA Manager cho phÐp Root POA b¾t ®Çu xö lý yªu cÇu miÔn lµ ORB b¾t ®Çu l¾ng nghe yªu cÇu. T¹o mét servant cña MyObject_impl. Ch­¬ng tr×nh gäi hµm _this cña servant ®Ó t¹o mét ®èi t­îng CORBA míi, cã thêi gian tån t¹i ng¾n vµ t¹o lËp nã víi servant. Sau ®ã ch­¬ng tr×nh l­u tr÷ tham chiÕu ®èi t­îng tr¶ vÒ trong mét biÕn MyObject_var vµ biÕn nµy sÏ tù ®éng ®­îc release khi mµ MyObject_var hÕt ph¹m vi ho¹t ®éng. §Ó t¹o tham chiÕu ®èi t­îng cho ®èi t­îng CORBA míi tíi c¸c Client, ch­¬ng tr×nh chuyÓn ®æi no sang d¹ng string b»ng viÖc sö dông hµm object_to_string cña ORB. Sau ®ã g¸n x©u tr¶ vÒ cho biÕn String_var råi ®­a ra thiÕt bÞ chuÈn. Ch­¬ng tr×nh gäi thñ tôc ORB::run ®Ó b¾t ®Çu l¾ng nghe c¸c yªu cÇu. ViÖc chuyÓn ®èi tham chiÕu sang d¹ng String (cô thÓ ë phÇn 7.10) cho phÐp client nhËn ®­îc tham chiÕu ®èi t­îng mét c¸ch chÝnh x¸c ®Ó cã thÓ gäi yªu cÇu trªn ®èi t­îng. DÜ nhiªn nh÷ng øng dông s¶n phÈm sÏ kh«ng bao giê dïng c¸ch tham chiÕu ®èi t­îng nh­ vËy mµ dïng dÞch vô tham chiÕu ®èi t­îng nh­ Naming (c.18) hoÆc trading (c19). 6. Quy t¾c chuyÒn tham sè Qu¶n lý bé nhí lµ cèt lâi cña viÖc ¸nh x¹ c++ phÝa server. VÝ dô trªn ®· tr¸nh ®Ò cËp tíi vÊn ®Ò qu¶n lý bé nhí ®Ó tËp trung vµo c¸c ®Þnh nghÜa líp servant. Cïng víi qui t¾c phÝa Client . Qui t¾c truyÒn tham sè phÝa server ®­îc thùc hiÖn víi 2 yªu cÇu. Trong suèt vÒ vÞ trÝ Qu¶n lý bé nhí cho Server còng nh­ Client, c¸c ®èi t­îng cã thÓ ®­îc ®Æt cïng nhau hoÆc kh«ng ®Æt cïng nhau. HiÖu qu¶ Sao chÐp tham sè cã thÓ bá qua bÊt cø khi nµo cã thÓ ®Æc biÖt khi Client vµ ®èi t­îng ®Ých ®­îc ®Æt gÇn nhau. Ta nhËn thÊy r»ng qui t¾c truyÒn tham sè phÝa server t­¬ng tù nh­ qui t¾c phÝa Cilent v× vËy cho phÐp g¸n hiÖu qu¶ c¸c ®èi t­îng ®­îc ®Æt gÇn nhau. Qui t¾c truyÒn tham sè tr×nh bµy ë phÇn nµy tu©n theo cïng quy t¾c víi phÇn 7.14 ®· tr×nh bµy ë phÝa Cilent. NÕu b¹n ch­a ch¾c ch¾n vÒ sù kh¸c nhau gi÷a c¸c kiÓu d÷ liÖu cã ®é dµi thay ®æi vµ d÷ liÖu cã ®é dµi cè ®Þnh vµ c¸c kiÓu d÷ liÖu IDL. H·y xem l¹i 7.14.1 (trang 275). 6.1. TruyÒn tham sè kiÓu ®¬n gi¶n. KiÓu ®¬n gi¶n hoÆc kiÓu liÖt kª ®­îc truyÒn theo trÞ hoÆc theo tham chiÕu phô thuéc vµo tham sè cã bÞ thay ®æi hay kh«ng. D­íi ®©y lµ 1 thao t¸c IDL sö dông tham sè kiÓu long interface Foo{ long long_op(in long l_in, inout long l_inout, out long l_out); }; ph­¬ng thøc t­¬ng øng trong líp skeleton cã d¹ng nh­ sau. Class POA_Foo:public vituar(PortableServer::ServantBase){ Public Virtual CORBA::long long_op( CORBA::long l_in, CORBA::long l_inout, CORBA::long l_out, ) throw (CORBA::SystemException)=0; //... }; ViÖc ¸p dông long_op trong líp servant ®­îc dÉn xuÊt cã thÓ ®­îc viÕt nh­ sau: CORBA::long Foo_ipml::long_op( CORBA::long l_in, CORBA::long & l_inout, CORBA::long long_out l_out, ) throw(CORBA::system exception) { l_inout =l_in*2; l_out=l-in/2; return 99; } Gi¸ trÞ cho c¶ l_in vµ l_inout ®­îc truyÒn trong hµm nµy b»ng lêi gäi. ViÖc thay ®æi gi¸ trÞ cña l_inout ®­îc truyÒn cho Orb servers vµo thêi gian ch¹y ®Ó tr¶ l¹i clien . Tham sè l_out kh«ng ®­îc khëi t¹o trong hµm nµy v× vËy ch­¬ng tr×nh cÇn thiÕt lËp gi¶ trÞ cña nã. Cuèi cïng göi l¹i gi¸ trÞ tr¶ vÒ qua c©u lÖnh return th­êng lÖ cña C++. 6.2 TruyÒn tham sè ®èi víi kiÓu d÷ liÖu phøc t¹p cã ®é dµi cè ®Þnh. Quy t¾c viÖc truyÒn tham sè cho kiÓu d÷ liÖu phøc t¹p cã chiÒu dµi cè ®Þnh (struct vµ union) t­¬ng tù kiÓu d÷ liÖu ®¬n gi¶n ngo¹i trõ tham sè vµo ®­îc truyÒn kiÓu tham chiÕu tíi h»ng ®Ó tr¸nh sao chÐp. Sau ®©y lµ mét thñ tôc IDL truyÒn tham sè struct cã ®é dµi cè ®Þnh. Struct Fls{ // Fixed –length struct Long l_mem; Doubel d_mem; }; interface Foo{ Fls fls_op(in Fls fls_in, inout Fls fls_inout, out Fls fls_out); }; Ph­¬ng thøc t­¬ng øng ë líp skeleton nh­ sau: Class POA_Foo: public virtual PortableServer:: ServantBase{ Public: Virtual Fls fls_op( Const Fls &fls_in; Fls & fls_inout; Fls _out fls_out; ) throw (CORBA::System Exception)=0; //... }; ViÖc cµi ®Æt fls_op trong líp servant ®­îc dÉn xuÊt cã thÓ ®Þnh nghÜa nh­ sau: Fls Foo_impl::fls_op( Const Fls &fls_in; Fls & fls_inout; Fls _out fls_out; ) throw (CORBA::System Exception); { // sö dông gi¸ trÞ biÕn fls_in vµ fls_inout // hiÖu chØnh fls_inout fls_inout.l_mem*=2; fls_inout.d_mem/=2; // khëi t¹o fls_out fls_out.l_mem=1234; fls_out.d_mem=5,678e8; // T¹o vµ khëi t¹o gi¸ trÞ tr¶ vÒ. Fls resutl={4321,-9,78e6); Return result; } Tham sè fls_in ®­îc tham chiÕu d¹ng h»ng, v× vËy chØ cho phÐp ®äc c¸c thµnh phÇn struct. Th­êng th× ph­¬ng thøc cña ta sÏ xö dông ph­¬ng thøc in, inout nh­ng ®Ó cho ®¬n gi¶n chóng ta sÏ kh«ng xÐt ë ®©y. Sau khi sö dông gi¸ trÞ cña ®Çu vµo cho fls_inout, ch­¬ng tr×nh thay ®æi gi¸ trÞ cña c¸c thµnh phÇn. Chó ý: ®©y chØ lµ vÝ dô ®¬n gi¶n, kiÓu phøc t¹p inout cã ®é dµi cè ®Þnh ®­îc truyÒn theo kiÓu tham chiÕu cho phÐp ph­¬ng thøc cã thÓ hiÖu chØnh nã. Tham sè fls_out ®­îc khëi t¹o qua ph­¬ng thøc nµy, v× vËy ch­¬ng tr×nh sÏ khëi t¹o c¸c thµnh phÇn ®Ó vµo thêi gian ch¹y ch­¬ng tr×nh ORB server cã thÓ göi c¸c thµnh phÇn ®ã vÒ cho Client. Cuèi cïng, ch­¬ng tr×nh khai b¸o Fls côc bé, khëi t¹o vµ tr¶ vÒ gi¸ trÞ cña nã qua c©u lÖnh return. 6.3>TruyÒn tham sè m¶ng víi sè phÇn tö cè ®Þnh ¸nh x¹ m¶ng IDL trùc tiÕp sang m¶ng C++ .Tr«ng C++ c¸c m¶ng lu«n ®­îc truyÒn bëi con trá .D­íi ®©y lµ thao t¸c truyÒn tham sè m¶ng cã ®é dµi cè ®Þnh : typedef foo { Darr darr_op(in darr darr_in, Inout darr darr_inout Out darr darr_out ) ; } ; ph­¬ng thøc t­¬ng øng trong líp skeleton cã d¹ng : class poa_foo:: public virtual portableserver :: servantbase{ public virtual darr slice * darr_op ( const darr darr_in, darr darr_inout, darr_out darr_out, ) throw (CORBA::systemexception )=0 … }; viÖc cµi ®Æt Darr_op trong líp servant nh­ sau; darr_slice *foo_impl::darr_op ( const darr darr_in , darr darr_inout, darr_out darr_out, ) throw (CORBA::systemexception ) const int array_length =sizeof (darr_in)/ sizeof (*darr_out) ; int i; //sö dông gi¸ trÞ truyÒn vµo cña darr_in and darr_inout //thay ®æi darr_inout for (i=0; i< array_length; i++) { darr_inout[i]* =i; } // khëi t¹o darr_out for (i=0; i< array_length; i++) { darr_out[i]* =i; } // t¹o vµ khëi t¹o gi¸ trÞ tr¶ vÒ darr_slice *result =darr_alloc(); for (i=0; i< array_length; i++) { result[i]* =i*i; } return result; } Tr¸ch nhiÖm qu¶n lý bé nhí cña ph­¬ng thøc servant nh­ sau : + tham sè vµo darr_in ®­îc truyÒn theo kiÓu h»ng (const Darr) gièng nh­ con trá h»ng CORBA::double ,v× vËy ch­¬ng tr×nh ®­îc phÐp truy cËp gi¸ trÞ ®­îc l­u tr÷ trong m¶ng nh­ng kh«ng ®­îc phÐp thay ®æi. M¶ng ®­îc x¸c ®Þnh bëi lêi gäi, ph­¬ng thøc servant kh«ng cã tr¸ch nhiÖm qu¶n lý bé nhí cho nã. + Tham sè vµo/ra darr_inout ®­îc truyÒn nh­ mét biÕn darr_out. Nã hiÖu qu¶ nh­ con trá CORBA::double, cho phÐp ch­¬ng tr×nh truy cËp vµ hiÖu chØnh gi¸ trÞ cña m¶ng , nh­ víi tham sè vµo, ph­¬ng thøc servant kh«ng cã tr¸ch nhiÖm qu¶n lý bé nhí cho m¶ng. Lêi gäi x¸c ®Þnh nã vµ truyÒn nã vµo, ®äc vµ ghi gi¸ trÞ cña nã. + tham sè ra darr_out ®­îc truyÒn nh­ kiÓu darr-out kiÓu nµy lµ mét typedef cho darr vµ ®­îc sö dông cho sù nhÊt qu¸n víi c¸c kiÓu ra kh¸c. Mét tham sè ra ch­a ®­îc khëi t¹o khi truyÒn tíi ph­¬ng thøc servant bëi v× nã truyÒn tõ server sang client. Do ®ã ®o¹n m· vÝ dô ®· thiÕt lËp tÊt c¶ c¸c gi¸ trÞ trong m¶ng sao cho khi ch¹y ORBServer cã thÓ göi nã trë l¹i Client. Chó ý r»ng víi m¶ng vµo vµ vµo/ra cña c¸c phÇn tö cã ®é dµi cè ®Þnh, tr×nh gäi sÏ ph¶i cÊp ph¸t m¶ng vµ ph­¬ng thøc servant cña ta kh«ng cã tr¸ch nhiÖm qu¶n lý bé nhã cña nã. + Bëi v× C++ kh«ng cho phÐp tr¶ vÒ gi¸ trÞ cña m¶ng ,do ®ã kiÓu tr¶ vÒ cña ph­¬ng thøc servant lµ Darr.slice * . Ph­¬ng thøc servant cña chóng ta sÏ cÊp ph¸t ®éng mét thùc thÓ (thÓ hiÖn ) darr b»ng viÖc sö dông hµm darr_alloc ®­îc sinh ra bëi tr×nh dÞch IDL ®iÒn c¸c gi¸ trÞ vµ tr¶ nã vÒ lêi gäi cña ph­¬ng thøc servant ,cã thÓ lµ client trong cïng mét tiÕn tr×nh cho tr­êng hîp cÊp ph¸t hoÆc sÏ lµ b¶n th©n Orb nÕu client lµ mét m¸y tÝnh ë xa , cã tr¸ch nhiÖm cuèi cïng lµ gäi darr_fee trªn gi¸ trÞ tr¶ vÒ ®óng c¸nh ®Ó gi¶i phãng nã. cÊp ph¸t gi¸ trÞ tr¶ vÒ sö dông hµm darr_alloc ,nÕu ta sö dông to¸n tö New th× cã

Các file đính kèm theo tài liệu này:

  • doc77351.DOC