J2SE1.4 در داخل‌ مجموعه CORBA زندگي‌ جديد خود را آغاز مي‌كند

 

قسمت‌ اول‌

 

نويسنده: Tarak Modi

 Javaworld

مترجم: محمدرضا معظمي

 

خلاصه‌

CORBA محيط‌ كار Java را با فراهم‌ كردن‌ يك‌ چارچوب distributed-object كامل‌ مي‌كند كه‌ براي‌ پشتيباني‌ آن‌ چارچوب‌ و قابليت‌ استفاده‌ مفيد از ديگر زبانهاي‌ برنامه‌نويسي، سرويس‌ ارائه‌ مي‌دهد.

محيط‌ كار Java نيز براي CORBA موارد زير را فراهم‌ مي‌كند؛ يك‌ بار بنويس، و هر جايي‌ كه‌ مي‌خواهي‌ ببر و اجرا كن، يك‌ محيط‌ عملياتي‌ شديدا سودمند و يك‌ محيط‌ كار تنومند. از تركيب Java با CORBA و ديگر تكنولوژي‌هاي enterprise كليدي، محيط‌ كار Java2 يك‌ محيط‌ كار نهايي‌ براي‌ حل‌ مشكلات‌ تكنولوژي distributed مي‌باشد. در اين‌ چهار بخشي‌ كه‌ به‌ موضوع‌ توسعه‌ نسخه enterprise از CORBA مي‌پردازد، آقاي Tarak Modi ويژگيهاي‌ جديد CORBA در (java2 Platform, Standart Edition) J2SE 1.4  را مورد كندوكاو قرار مي‌دهد و در مورد چگونگي‌ استفاه‌ از آن‌ براي‌ ساخت‌ برنامه‌هاي‌ شديدا قوي‌ و ماهرانه‌ به‌ بحث‌ و بررسي‌ مي‌پردازد. بخش‌ اول‌ با بررسي‌ اين‌ ويژگيها آغاز شده‌ و با يك Tutorial مختصري‌ بر روي‌ ساخت‌ يك‌ نمونه‌ ساده‌ از برنامه‌هاي CORBA-base با استفاده‌ از J2SE 1.4 خاتمه‌ مي‌يابد.

 

Tarak Modi

در دهه‌اي‌ كه‌ گذشت، CORBA يا Common Object Request Broker Architecture با وعده‌ نخستين‌ خودش‌ به‌ توسعه‌دهندگان، به‌ حيات‌ خود ادامه‌ داده‌ است، به‌ اين‌ مضمون‌ كه‌ يك‌ مشخصه‌ باز، استاندارد و بدون‌ طرفداري‌ از شركت‌ فروشنده، محيط‌ كاري‌ و زبان‌ به‌ منظور محاسبات‌ ناهمگن‌ براي‌ آنها فراهم‌ نكند. استفاده‌ از IIOP يا Internet Inter-ORB Protocol به‌ عنوان‌ يك‌ برنامه‌ تحت CORBA از هر شركت‌ فروشنده‌اي‌ كه‌ مي‌باشد مي‌تواند بر روي‌ اكثر كامپيوترها، سيستم‌ عاملها، زبانهاي‌ برنامه‌نويسي‌ و شبكه‌ها اثرپذيري‌ متقابلي‌ را با يك‌ برنامه‌ تحت CORBA از همان‌ شركت‌ فروشنده‌ و يا يك‌ شركت‌ ديگر، بر روي‌ اكثر كامپيوترهاي‌ ديگر، سيستم‌ عاملها، زبانهاي‌ برنامه‌نويسي‌ و شبكه‌ها داشته‌ باشد.

Java به‌ طور مشابهي Has lived up equaliy well براي‌ قولش‌ به‌ منظور فراهم‌ كردن‌ محيط‌ يك‌ بار بنويس‌ و هر جايي‌ كه‌ مي‌خواهي‌ ببر و اجرا كن‌ و يك‌ محيط‌ عملياتي‌ شديدا سودمند و يك‌ محيط‌ كار تنومند. آيا امري‌ غافلگيرانه‌تر از اين‌ است‌ كه‌ ازدواج‌ بين CORBA و Java عقدي‌ است‌ كه‌ در آسمانها بسته‌ شده‌ است؟

اين‌ مقاله‌ در اولين‌ بخش‌ از 4 بخش‌ خود با يك‌ پيشينه‌ مختصري‌ از سير تكاملي CORBA شروع‌ خواهد شد و سپس‌ بخش‌ عمده‌اي‌ كه‌ به CORBA2.3.1 اضافه‌ شده‌ و J2SE 1.4 را پشتيباني‌ مي‌كند، به‌ طور مختصر بيان‌ خواهم‌ كرد و در آخر نيز با بررسي‌ اين‌ كه‌ ما در چه‌ مواردي‌ يك‌ برنامه‌ با استفاده‌ از CORBA و J2SE خواهيم‌ ساخت، به‌ مقاله‌ پايان‌ خواهم‌ داد.

 

بررسي‌ سريع‌ تاريخچه‌

در سال‌ 1991 OMG يا Object Management Group، نرم‌افزار CORBA1.1 را معرفي‌ كرد كه IDL يا Interface Definition Language و APIها را معين‌ مي‌كرد و به‌ صورتي‌ كه‌ اثر متقابل‌ از يك Object‌ به‌ نام Client/server را همراه‌ يك‌ عملكرد معيني‌ از يك ORB يا Object Request Broker فعال‌ مي‌ساخت. CORBA2.0  كه‌ در دسامبر 1994 تنظيم‌ شد يك‌ گام‌ بزرگي‌ را پيش‌ برد و به‌ شكلي‌ واقعي‌ قابليت‌ استفاده‌ مفيد بين ORBها را از شركت‌هاي‌ متفاوتي‌ از طريق IIOP، كه IP/TCP mapping از GIOP يا General Inter-ORB Protocol مي‌باشد، تعيين‌ كرد. CORBA2.0  متعهد اين‌ قضيه‌ است‌ كه‌ همه ORBهاي‌ آماده، IIOP را براي‌ اطمينان‌ كه‌ اثرپذيري‌ متقابل‌ پشتيباني‌ مي‌كند.

از آن‌ پس CORBA به‌ آرامي‌ نسخه‌هاي‌ خود را ارائه‌ كرد (نسخه‌ كنوني 2.6.1 است) ولي‌ در اين‌ سير تكاملي‌ هر محله‌ شاهد افزايش‌ ويژگيهاي‌ استواري‌ است‌ كه‌ به‌ سمت‌ ساخت‌ سيستم‌هاي‌ ماهرانه enterprise جهت‌دار شده‌ است. شركت Sun Microsystem در سال‌ 1998 پشتيباني‌ از CORBA را همراه‌ نسخه release شده JDK1.2 و موارد اضافه‌ شده Java IDL و يك ORB ساده‌ شروع‌ كرد و اين‌ امر آغاز يك‌ رابطه‌ دور و دراز بين Java و CORBA شد. امروزه‌ بعد از گذشت‌ 4 سال J2SE 1.4 اين‌ ازدواج‌ را با پشتيباني‌ از CORBA2.3.1 مي‌دهد. (همان‌طور كه‌ قبلا اشاره‌ شد تازه‌ترين‌ نسخه CORBA شماره 2.6.1 مي‌باشد؛ تنها تفاوت‌ مهم‌ با نسخه 2.3.1 وجود CORBA messaging است‌ كه‌ در نسخه 2.4 اضافه‌ شد)

 

اساس‌ معماري CORBA

Text Box:  
شكل‌ 2. اثرپذيري‌ متقابل‌ بين ORBها

شكل‌ 1 ماهيت‌ يك CORBA method invocation را نشان‌ مي‌دهد. چنانكه‌ در اغلب‌ سيستم‌هاي distributed، client به‌ يك‌ نماينده‌ نرم‌افزار (يا (object Server رجوع‌ مي‌كند. اين‌ نماينده‌ در CORBA يك stub ناميده‌ مي‌شود. يك Client با Stub در قالب‌ يك Server ارتباط‌ متقابل‌ برقرار مي‌كند و روش invocation را بر روي‌ آن‌ حاكم‌ مي‌سازد. Stub درخواست‌ را به‌ سمت ORB ارسال‌ مي‌دارد كه‌ به‌ نوبه‌ خود محل‌ برنامه‌هاي Server را مشخص‌ مي‌كند و صورت‌ لزوم‌ درخواست‌ را به‌ جريان‌ مي‌اندازد. ORB با برنامه‌هاي Server از طريق‌ يك‌ نماينده‌ ديگر نيز ارتباط‌ متقابل‌ دارد، اين‌ نماينده Skeleton ناميده‌ مي‌شود و سرانجام، برنامه‌هاي Server درخواست Client را مورد پردازش‌ قرار مي‌دهند و نتايج‌ از همان‌ مسير به‌ سمت Client باز مي‌گردد.

Text Box:  
شكل‌ 1
بله، من‌ به‌ شرح‌ و تفصيل‌ برخي‌ از جزييات‌ بالا پرداختم. ابتدا، يك‌ درخواست synchronous را توصيف‌ كردم‌ كه‌ انتظار Client براي‌ پاسخ‌ به‌ درخواستش، قبل‌ از اقدام‌ به‌ عمل‌ بعدي‌ مي‌باشد. CORBA2.3.1 يك‌ درخواست cleferred synchronous را نيز به‌ نام polling پشتيباني‌ مي‌كند به‌ طوري‌ كه Client مي‌تواند به‌ طور نوبتي‌ بازگردد و از ORB اگر پاسخي‌ براي‌ درخواست(هاي) قبلي‌اش‌ دريافت‌ كرده‌ باشد، تقاضا كند. نوع‌ ديگر از درخواست‌ به‌ شكل‌ درخواست on-way مي‌باشد كه CORBA آن‌ را fire and forget مي‌نامد. در اينجا Client درخواست‌ را ساخته‌ و سپس‌ آن‌ را رها مي‌كند.

CORBA هيچگونه‌ ضمانتي‌ را درباره‌ چگونگي‌ انجام‌ اين‌ درخواستهاي on-way توسط ORBها متعهد نمي‌شود. بطور مثال، يك ORB كه‌ هيچگونه‌ درخواست on-way را تحويل‌ نمي‌دهد، مي‌خواهد مورد قبول CORBA هم‌ باشد (عجب‌ توقعي!) بالاخره CORBA2.4 نيز يك‌ سبك‌ پيام‌رساني asynchronous خبره‌اي‌ را ارائه‌ مي‌دهد كه‌ از آن‌ جايي‌ كه‌ جزيي‌ از J2SE 1.4  نمي‌باشد به‌ خارج‌ از محدوده‌ اين‌ سري‌ مقالات‌ كشيده‌ مي‌شود. (همان‌طور كه‌ به‌ ياد داريد CORBA2.3.1 را پشتيباني‌ مي‌كند). نكته‌ ديگر اينكه‌ من‌ به‌ شرح‌ و تفصيل‌ در مورد پروتكل‌هاي‌ ارتباطي‌ درگير با روش invocation و تشكيلات ORB پرداختم. براي‌ تصور مطلب، ORB از 2 بخش‌ اصلي‌ تشكيل‌ شده‌ است: يك‌ زمان‌ اجرا client-side (runtime) و يك‌ زمان‌ اجرا server-side. Stubها بخشي‌ از زمان‌ اجراي client-side بوده‌ و skeletonها بخشي‌ از زمان‌ اجراي server-side مي‌باشند. در شكل‌ تصوري‌ قضيه، وقتي‌ كه‌ فقط‌ يك ORB درگير مي‌شود، همان‌طور كه‌ در مثالمان‌ تاكنون‌ مطرح‌ شد، پروتكل‌ ارتباطي‌ استفاده‌ شده‌ بين‌ زمان‌ اجراي client-side و server-side، ممكن‌ است IIOP يا هر پروتكل‌ ديگري‌ كه‌ موردپسند vendor است‌ باشد. شكل‌ 2 همين‌ مطلب‌ را بيان‌ مي‌كند. در چنين‌ مواقعي‌ بسياري‌ از ORBهاي‌ تجاري‌ يك‌ پروتكل‌ بسيار كارآمد و بهينه‌ شده‌اي‌ را مورد استفاده‌ قرار مي‌دهند. ولي‌ به‌ خاطر داشته‌ باشيد: تمام ORBهايي‌ كه‌ با نسخه‌ 2 يا بالاتر CORBA كار مي‌كنند بايد ارتباطي‌ كه IIOP را استفاده‌ مي‌كند، به‌ خوبي‌ پشتيباني‌ كنند. تا اثرپذيري‌ متقابل‌ با ORBها را مطمئن‌ سازد.

اكنون‌ به‌ شكل‌ 3 كه‌ همان‌ عملكرد شكل‌ 1 را با يك‌ تفاوت‌ عمده‌ نشان‌ مي‌دهد توجه‌ كنيد: نرم‌افزار client براي‌ كار با اولين vendor مربوط‌ به ORB ساخته‌ مي‌شود و نرم‌افزار server با دومين ORB vendor كار مي‌كند. خوشبختانه‌ هر دوي ORBها حداقل‌ با CORBA2.0  كار مي‌كنند و مي‌توانند از طريق IIOP نيز ارتباط‌ داشته‌ باشند، در غير اين‌ صورت‌ (منظور سازگاري) ارتباطات‌ بين‌ آنها نمي‌توانست‌ تضمين‌ شود.

حالا بياييد به‌ سراغ‌ جزييات‌ بيشتري‌ در مورد ORB runtime مربوط‌ به client-side برويم. همان‌طور كه‌ در بالا ذكر شد stub بخشي‌ از ORB مربوط‌ به client-side است. يك stub به‌ صورت precompile شده‌ و دست‌دوز! (به‌ احتمال‌ خيلي‌ زياد (Compile-generated براي‌ يك‌ نرم‌افزار كاربردي‌ خاص‌ تحت server مي‌باشد. ولي client مجبور نيست‌ براي‌ ارتباط‌ متقابل‌ با نرم‌افزار server اين stubها را استفاده‌ كند.

CORBA، dynamic invocation interface يا (DII) را تعريف‌ مي‌كند كه‌ يك API با اهداف‌ عمومي (general-purpose) براي‌ درخواست methodهايي‌ بر روي‌ نرم‌افزار remort server مي‌باشد. در بسياري‌ از حالات، DII اثباتمي‌كند كه‌ براي‌ استفاده، مشكل‌تر از stub مي‌باشد و يك‌ مقدار ناچيزي‌ هم‌ كارآيي‌ كمتري‌ دارد. هر چند كه‌ شما بعضي‌ وقتها احتياج‌ به‌ استفاده‌ از DII داريد، به‌ عنوان‌ مثال: براي‌ توسعه‌ ابزارهاي general-purpose و يا براي‌ فراخواندن methodهاي deferred synchronous.

Text Box:  
شكل‌ 3. يك client يك method را بر روي server در vendor's ORB ديگر درخواست‌ مي‌كند.

نكته: بسته‌ به‌ آن‌ اجرايي‌ از CORBA كه‌ شما استفاده‌ مي‌كنيد، ORB ممكن‌ است‌ يك single executable، multi executable و يا كم‌ و بيش‌ تركيبي‌ از executableها و libraryهاي share شده‌ (مانند DLLهاي‌ روي (Windows باشد. CORBA معين‌ نمي‌كند كه‌ يك ORB چگونه‌ اجرا شده‌ است. اين‌ مطلب‌ مبين‌ اين‌ مسئله‌ است‌ كه: اولا، يك vendor چگونه ORB را اجرا مي‌كند. در حالي‌ كه‌ به‌ محض‌ اجراي ORB وابستگي‌ بسيار زيادي‌ به‌ قابليت‌ دستگاه‌ پيدا مي‌كند (سخت‌افزار و سيستم‌ عامل). ثانيا، اجرا شدن، وابسته‌ به‌ ديگر خدمات‌ نيز مي‌باشد، مانند متعادل‌ كردن‌ فراخواني‌ در حافظه(Load balancing) و تحمل‌ خطا fault Tolerance))، كه vendor براي‌ رقابت‌ با ديگران‌ اين‌ تفاوتها را ارائه‌ مي‌دهد. از آن‌ جايي‌ كه OMG هر دوي‌ اين‌ جوانب‌ را احتمالا نمي‌تواند بداند و كنترل‌ كند، از تعيين‌ جزييات‌ يك اجراي‌ فيزيكي ORB خودداري‌ كرده‌ است.

 

چه‌ چيزهايي‌ در J2SE 1.4 جديد هستند؟

همان‌طور كه‌ اخيرا به‌ آن‌ اشاره‌ كردم، ارتباط‌ بين Java و CORBA در سال‌ 1998 با JDK1.2  آغاز شد، زماني‌ كه‌ شركت Sun، Java IDL را به‌ عنوان‌ يك Java API براي اثرپذيري متقابل و كامل شدن با CORBA معرفي نمود. Java IDL شامل ORBهاي‌ مبني‌ بر Java كه IIOP را پشتيباني‌ مي‌كنند و كامپايلر IDL-to-Java، IDL به Java مي‌باشد كه‌ به‌ منظور توليد stubهاي client-side و skeletonهاي server-side است.

در سال‌ 1999، شركت JDK 1.3 Sun را release كرد، كه‌ اخيرا به‌ شكل (rechristened) J2SE و يك‌ كامپايلر 100 درصد خالص‌ جاوا به‌ نام IDL-to-Java، idij را معرفي‌ كرد كه‌ به‌ همراه‌ پشتيباني‌ از IDL abstract interface و value Typeها مي‌باشد.

امروزه، با J2SE 1.4، شركت Sun، Portable Object Adopter يا (POA)، Interceptorهاي‌ قابل‌ حمل، Interoperable Naming Service يا (INS)، dynamic anys, GIOP1.2  را به‌ طور كامل‌ پشتيباني‌ مي‌كند.

J2SE 1.4 شامل انجام خدمات naming جديد به نام Object Request Broker Daemon يا (ORBD) مي‌باشد، كه به Clientها اجازه مي‌دهد تا در محيط CORBA به صورت Transparent مستقر شده و Objectهاي مقاوم را براي Server درخواست كنند.

ORBD يك پردازش Daemon است كه سرويس Bootstrap، سرويس Transient naming، سرويس Persistent naming و مدير Server را شامل مي‌شود.

J2SE 1.4 نيز (به منظور سازگاري با موارد قبلي) tnameserv را كه انجام سرويس Transient naming است را پشتيباني مي‌كند، اين امر از JDK1.2 سرچشمه گرفته است. من استفاده از ORBD را در تمام برنامه‌هاي كاربردي جديدتان توصيه مي‌كنم. ما اين مطلب را در مثال Hello World در اين مقاله استفاده خواهيم كرد. من در بخش 2 و بخش 3 از اين سري مقالات درباره مراجع objectهاي پايدار و ناپايدار بيشتر صحبت خواهم كرد.

به علاوه، J2SE 1.4 شامل يك ابزار جديد به نام Servertool مي‌باشد كه يك Command-Line را براي برنامه‌نويسهاي نرم‌افزارهاي كاربردي فراهم مي‌كند تا يك Persistent Server را توسط ORBD Register، Unregister، Startup و Shutdown كنند. من از اين ابزار در بخشهاي 2 و 3 از اين سري مقالات استفاده خواهم كرد.

 

 

Portable Object Adopter

يك object adopter در CORBA، نرم‌افزارهاي‌ كاربردي‌ (يا objectهاي) server و ORB را به‌ هم‌ مي‌چسباند. يك object adopter موارد زير را ايجاد مي‌كند: مراجع object، مديريت‌ دوره‌هاي‌ عمر object (life cycles)، ارسال‌ درخواستهاي client از ORB به object صحيح‌ و بازگرداندن‌ نتيجه‌ درخواست‌ به .ORB مشخصه CORBA تا نسخه 2.2 فقط‌ يك object adopter ساده‌ و مبهمي‌ را توصيف‌ مي‌كرد كه‌ بدين‌ دليل Basic Object Adopter يا (BOA) ناميده‌ شد. از آن‌ جايي‌ كه BOA به‌ عنوان‌ يك‌ مشخصه‌ توصيف‌ شده‌ است‌ و براي‌ ايجاد نرم‌افزارهاي‌ كاربردي enterprise غيركافي‌ مي‌باشد، هرORB  Vendor،extentionهاي‌ اختصاصي‌ خودش‌ را اضافه‌ كرد، گاهي‌ اوقات‌ حتي‌ اسامي‌ مشابه‌ ديگر Vendorها براي‌ ايجاد يك‌ توهم‌ از اثرپذيري‌ متقابل‌ و code portability استفاده‌ مي‌كنند. CORBA 2.2، POA را معرفي‌ كرد كه‌ بسياري‌ از كمبودهاي BOA را مرتب‌ و درست‌ نمود. POA با توجه‌ به‌ اسمش، code portability را در ميان ORBها ضمانت‌ مي‌كند. POA نيز شرايط‌ جديدي‌ را براي CORBA ايجاد كرده‌ است، مانند Servnts وServant manager. بخش‌ 2 و 3 از اين‌ سري‌ مقالات، جزييات POA را همراه‌ چند مثال‌ پوشش‌ مي‌دهد.

 

Portable interceptors

Portable interceptors يا (PIS) تله‌هايي (hooks) در ORB مي‌باشد كه‌ سرويس‌هاي ORB را قادر مي‌سازد تا جريان‌ اجراي‌ طبيعي ORBها را قطع‌ نمايد. من‌ در بخش‌ 4 چندين‌ نوع‌ از PIS را مطرح‌ خواهم‌ كرد.

 

Interoperable Naming Serving

INS سعي‌ دارد تا نقاط‌ سخت‌ و دشوار را توسط CORBA object refrence و naming device ساده‌ سازد. يكي‌ از مشكلاتي‌ كه‌ توسعه‌دهندگان‌ با IORها (Interoperable object refrences) داشته‌اند اين‌ است‌ كه‌ آنها فقط‌ براي‌ خواندن‌ و حتي‌ به‌ خاطر سپردن‌ بسيار سخت‌ و دشوار مي‌باشند.

INS، URLهاي object كه‌ ساده‌تر و خواناتر مي‌باشد را پشتيباني‌ مي‌كند، شبيه‌ آن‌ دسته‌ از URLهايي‌ كه objectهاي RML را (remote method invocation) تعيين‌ مي‌كند.

توسعه‌دهندگان‌ همچنين‌ خطايي‌ در مسير names كه‌ بايد براي‌ استفاده‌ با naming service ايجاد شده‌ باشد، يافته‌اند. INS، stringified nameهايي‌ مانند Acme/Finance/Accountspayable را پشتيباني‌ مي‌كند. در بخش‌ 4، من‌ به INS خواهم‌ پرداخت‌ و همچنين‌ يك naming service browser مبتني‌ بر GUI را ايجاد خواهم‌ كرد.

 

 

Dynamic anys

براي‌ آن‌ دسته‌ از شماهايي‌ كه‌ با CORBA آشنايي‌ نداريد، لازم‌ به‌ ذكر است‌ كه‌ يك any يك Universal data type مي‌باشد كه‌ مي‌تواند تمام data typeهاي‌ ديگر را در دست‌ داشته‌ باشد. تا نسخه 2.2 از CORBA، يك any نمي‌توانست‌ به‌ صورت‌ پويا (dynamically) ايجاد شود و يك‌ مانع‌ طاقت‌فرسايي‌ براي‌ بعضي‌ از نرم‌افزارهاي‌ كاربردي‌ بود. براي‌ مثال، debuggerها، واسطه‌ كاربرهاي‌ عمومي (generic user interface) براي objectها و خدماتي‌ مانند OMG Notification Service، همه‌ قابليت‌ تفسير كردن (interpret) مقادير بدون‌ دانستن IDL Typeهاي‌ مقادير در زمان‌ كامپايل‌ را احتياج‌ دارند. DynAny interface در نسخه 2.2 نرم‌افزار CORBA اضافه‌ شد تا به‌ نرم‌افزارهاي‌ كاربردي‌ اجازه‌ دهد مقادير any را تجزيه‌ و تركيب‌ كنند. DynAny به‌ نرم‌افزارهاي‌ كاربردي‌ اجازه‌ مي‌دهد تا در زمان‌ اجراي (runtime) يك‌ مقدار كه‌ نوع‌ آن‌ زمان‌ كامپايل‌ شدن‌ نرم‌افزار ناشناس‌ است، درست‌ شود و به‌ صورت‌ يك any فرستاده‌ شود و به‌ همين‌ نحو Dynany به‌ برنامه‌هاي‌ كاربردي‌ اجازه‌ مي‌دهد تا يك‌ مقدار از نوع any را از يك‌ عملكرد invocation دريافت‌ دارد و نوع any را تفسير كند (با استفاده‌ از (Typecode interface) و مقدارش‌ را استخراج‌ كند (با استفاده‌ از (Dynamy Intgerface بدون‌ آگاهي‌ در مورد زمان‌ كامپايل (Compile-time) كه‌ نوعهاي IDL درگير آن‌ مي‌باشند. من‌ در اين‌ سري‌ از مقالات dynamic any بحث‌ و صحبت‌ نخواهم‌ كرد.

 

 

يك‌ مثال‌ سريع Hello World

حالا كه‌ شما مي‌دانيد J2SE 1.4 چه‌ چيزي‌ را ارائه‌ مي‌دهد، من‌ قدمهاي‌ بنيادي‌ را كه‌ احتياج‌ به‌ ساختن‌ يك‌ نرم‌افزار كاربردي CORBA دارد را امتحان‌ خواهم‌ نمود. از آن‌ جايي‌ كه‌ من‌ بسياري‌ از جزييات‌ را در 3 بخش‌ باقيمانده‌ از اين‌ سري‌ مقالات‌ مطرح‌ خواهم‌ كرد، لذا زمان‌ بسيار زيادي‌ را براي‌ توضيح code صرف‌ نخواهم‌ نمود. براي‌ ساخت‌ يك‌ نرم‌افزار كاربردي CORBA، اين‌ قدمهاي‌ اصلي‌ را دنبال‌ كنيد:

1- methodها را با استفاده‌ از IDL تعريف‌ كنيد.

2- IDL را با استفاده‌ از يك Compiler كامپايل‌ نماييد، بدين‌گونه‌ بناي Programming-language-Specific ساخته‌ مي‌شود.

3- نرم‌افزار Server را اجرا كنيد، كه‌ شامل‌ اجراهاي method و يك host كه‌ اجراي‌ همراه‌ با ORB runtime را راه‌اندازي‌ و رجيستر مي‌كند.

4- نرم‌افزارهاي client را براي‌ استفاده‌ از server ايجاد كنيد. همان‌طور كه‌ در بالا اشاره‌ كردم، من‌ در اين‌ مقاله‌ به‌ سمت‌ اين‌ گامها روي‌ آوردم. آخرين‌ بخش‌ از اين‌ سري‌ مقالات‌ مفاهيم‌ مهمي‌ را با مثالهاي‌ بهتري‌ توضيح‌ خواهم‌ داد. به‌ دور از مشغله‌هاي‌ بعدي، بياييد با مثال Hello World آغاز كنيم:

 

 

 

قدم‌ اول: تعريف متدها با استفاده‌ از IDL

اينجا براي‌ مثال Hello World، IDL است.

module hello
+{
  interface Hello
  {
    string sayHello();
    oneway void shutdown();
  };
};

قدم‌ دوم: كامپايل‌ كردن IDL با استفاده‌ از كامپايلر idlj

اينجا دستوري‌ است‌ كه IDL بالا را براي‌ ايجاد Java interface و obstract classes، كامپايل‌ مي‌كند

      idlj -fall Hello.idl

 

idlj در دايركتوري bin از برنامه‌ نصب J2SE 1.4 قرار دارد. اين‌ كامپايلر خصوصيات‌ ترسيمي IDL-to-Java مربوط‌ به CORBA را اجرا مي‌كند و برخي‌ از فايلهاي‌ جاوا را به‌ عنوان‌ خروجي‌ توليد مي‌كند كه‌ من‌ به‌ طور خلاصه‌ در زير توضيح‌ مي‌دهم:

abstract class :Hello POA.Java كه object سرور ما آن‌ را بسط‌ خواهد داد.

:Hello Helper.Java تابعي‌ كمكي‌ را فراهم‌ مي‌سازد و به‌ طور قابل‌ ملاحظه‌اي‌ متد narrow() احتياج‌ به‌ قرار گرفتن‌ در قالب‌ مراجع object مربوط‌ به CORBA براي‌ نوعهاي‌ مناسب‌ خودشان‌ دارد.

Hello Holder.Java: هر وقت‌ كه  interface (يا (Type مربوط‌ به Hello يك‌ پارامتر Out يا inout براي‌ يك‌ متد تعريف‌ شده‌ در IDL باشد استفاده‌ مي‌شود.

client Stub :-HelloStub.Java عملكرد تابعي CORBA را براي client فراهم‌ مي‌كند.

Hello.Java و :Hello perations.Java همراه‌ با هم interfaceهايي‌ كه‌ شامل‌ نسخه IDL interface مربوط‌ به Java ما مي‌باشد را فراهم‌ مي‌كند.

 

 

 

قدم‌ سوم: اجراي‌ نرم‌افزارهاي‌ كاربردي سرور

همان‌طور كه‌ در بالا اشاره‌ شد، اجراي‌ نرم‌افزارهاي‌ تحت server شامل‌ 2 قسمت‌ مي‌باشد: يك class كه‌ متدهايي‌ از interface مربوط‌ به server را اجرا مي‌كند و class ديگري‌ كه‌ ميزباني object را مي‌كند و آن‌ را با ORB runtime و naming service رجيستر مي‌نمايد.

 

package hello;

import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.Properties;

class HelloImpl extends HelloPOA {
  private ORB orb;

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

  // Implement sayHello() method
  public String sayHello() {
    return "\nHello world !!\n";
  }

  // Implement shutdown() method
  public void shutdown() {
    orb.shutdown(false);
  }
}


public class HelloServer {

  public static void main(String args[]) {
    try{
      // Create and initialize the ORB
      ORB orb = ORB.init(args, System.getProperties());

      // Get reference to rootpoa
      POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));      

      // Create servant and register it with the ORB
      HelloImpl helloImpl = new HelloImpl();
      helloImpl.setORB(orb);

      // Get object reference from the servant
      org.omg.CORBA.Object ref = rootPOA.servant_to_reference(helloImpl);
      Hello href = HelloHelper.narrow(ref);

      // Get the root naming context
      org.omg.CORBA.Object objRef =
          orb.resolve_initial_references("NameService");
      // Use NamingContextExt, which is part of the Interoperable
      // Naming Service (INS) specification
      NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

      // Bind the Object reference in Naming
      String name = "Hello";
      NameComponent path[] = ncRef.to_name( name );
      ncRef.rebind(path, href);

      // Activate the POAManager
      rootPOA.the_POAManager().activate();

      System.out.println("HelloServer ready and waiting ...");
      System.out.println(orb.object_to_string(href));

      // Wait for invocations from clients
      orb.run();
    }

      catch (Exception e) {
        System.err.println("ERROR: " + e);
        e.printStackTrace(System.out);
      }

      System.out.println("HelloServer Exiting ...");

  }
}

 

قدم‌ چهارم: ساخت‌ نرم‌افزارهاي client براي‌ استفاده server

اينجا يك‌ نمونه client براي‌ تست‌ سرور وجود دارد:

package hello;

import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

import java.util.*;

public class HelloClient
{
  static Hello helloImpl;

  public static void main(String args[])
    {
      try{
        // Create and initialize the ORB.
        ORB orb = ORB.init(args, System.getProperties());

        // Get the root naming context.
        org.omg.CORBA.Object objRef =
          orb.resolve_initial_references("NameService");
        // Use NamingContextExt instead of NamingContext. This is
        // part of the Interoperable Naming Service.
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

        // Resolve the Object reference in Naming.
        String name = "Hello";
        helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

        System.out.println("Obtained a handle on server object: " + helloImpl);
        System.out.println(helloImpl.sayHello());
        helloImpl.shutdown();

      } catch (Exception e) {          
        e.printStackTrace();
        }
    }

}

اينک فايلهای server و client را كمپايل کنيد. سپس فرمان زير را اجرا کنيد:

orbd -ORBInitialPort 1050 -ORBInitialHost pcworldi.ipowermysql.com

سرور را اجرا کنيد:

      java HelloServer -ORBInitialPort 1050 -ORBInitialHost pcworldi.ipowermysql.com

سپس client را اجرا کنيد:

      java HelloClient -ORBInitialPort 1050 -ORBInitialHost pcworldi.ipowermysql.com

 

تا دفعه‌ بعد

در اين‌ مقاله‌ مقدمه‌اي، من‌ اين‌ مرحله‌ را براي‌ ارائه‌ عناوين‌ سرگرم‌كننده‌ و پيشرفته‌تر در باقيمانده‌ بخشهاي‌ اين‌ سري‌ مقالات‌ تنظيم‌ كرده‌ام. در بخش‌ 2 من‌ نسخه release شده POA در CORBA2.2 را به‌ شما معرفي‌ خواهم‌ كرد كه‌ يكي‌ از مهمترين‌ موارد portability-enhancing اضافه‌ شده‌ به CORBA را بعد از IDL ارائه‌ مي‌كند بخش‌ 3 به‌ سراغ‌ جزييات‌ بيشتر درباره POA خواهد رفت. و بالاخره‌ بخش‌ 4 knickknacks را پوشش‌ خواهد داد، مانند portable intercoptor و INS.

 

 

 

معرفی نويسنده‌:

 

Tarak Modi نرم‌افزارهاي‌ كاربردي‌ حرفه‌اي، با عملكرد بسيار بالا و distributed را به‌ مدت‌ بيش‌ از هفت‌ سال‌ معماري‌ كرده‌ است‌ و هم‌اكنون‌ يك‌ متخصص‌ ارشد با North Highland، شركت‌ مشاوره‌ فني‌ و مديريت‌ مي‌باشد. تجربه‌ حرفه‌اي‌ او شامل‌ هسته‌ اصلي C++ (hardcore) و برنامه‌نويسي Java مي‌باشد كه‌ با تكنولوژي‌هاي‌ ميكروسافت‌ مانند (Component object Model) COM، (Microsoft transaction Server) MTS و COM+ كار مي‌كند. تكنولوژي‌هاي‌ مبني‌ بر Java، شاملJ2SE  و CORBA مي‌شود. وي‌ همچنين‌ همكار مولف Professional Java Web Services مي‌باشد. براي‌ آشنايي‌ بيشتر با وي، website شخصي‌ او را به‌ آدرس‌ زير ديدن‌ نماييد.

http://www.tekNirvana.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

منابع

·         Sun's Java IDL documentation:
http://java.sun.com/j2se/1.4/docs/guide/idl/

·                   Advanced CORBA Programming with C++, Michi Henning and Steve Vinoski (Addison-Wesley, 1999; ISBN 0201379279):
http://www.amazon.com/exec/obidos/tg/detail/-/0201379279/javaworld

·                   The OMG CORBA 2.3.1 specification:
http://cgi.omg.org/docs/formal/99-10-07.pdf

·                   Read more JavaWorld articles written by Tarak Modi:

o   "Axis: The Next Generation of Apache SOAP" (January 2002) http://www.javaworld.com/javaworld/jw-01-2002/jw-0125-axis.html

o   "Clean Up Your Wire Protocol with SOAP"

§    Part 1: An introduction to SOAP basics (March 2001) http://www.javaworld.com/javaworld/jw-03-2001/jw-0330-soap.html

§    Part 2: Use Apache SOAP to create SOAP-based applications (April 2001) http://www.javaworld.com/javaworld/jw-04-2001/jw-0427-soap.html

§    Part 3: Create SOAP services in Apache SOAP with JavaScript (June 2001) http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-soap.html

§    Part 4: Dynamic proxies make Apache SOAP client development easy (July 2001) http://www.javaworld.com/javaworld/jw-07-2001/jw-0706-soap.html

o   "Add the Power of Asynchronous Processing to Your JSPs" (February 2001) http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-jms.html

o   "Lock On to an Alternate Synchronization Mechanism" (July 2000) http://www.javaworld.com/jw-07-2000/jw-0714-locks.html

·         Browse the CORBA section of JavaWorld's Topical Index:
http://www.javaworld.com/channel_content/jw-corba-index.shtml

·         Browse the Java 2 Platform, Standard Edition (J2SE) section of JavaWorld's Topical Index:
http://www.javaworld.com/channel_content/jw-j2se-index.shtml

·         Share your experiences with CORBA in our Enterprise Java discussion:
http://forums.idg.net/webx?50@@.ee6b80a

·         Sign up for JavaWorld's free weekly email newsletters:
http://www.javaworld.com/subscribe

·         You'll find a wealth of IT-related articles from our sister publications at IDG.net: http://www.idg.net/jump?id=1100

 

 

 

Copyright 2002, PC World Communications / International Data Group Inc. / PC World Iran

All rights reserved.