PDA

View Full Version : سوال: ejb3 and RMI



javaphantom
چهارشنبه 29 خرداد 1387, 14:05 عصر
سلام من چطور می تونم از یک کامپیوتر دیگر که مثلا به عنوان client در نظر بگیرید به یک remote object در سروری که در یک ادرس دیگر هست دست رسی داشته باشم و بتونم از متدود های اون Object استفاده کنم
اگر ممکن یک نمونه code کوچک بنویسید.

javaphantom
چهارشنبه 12 تیر 1387, 02:11 صبح
چند هفته پیش من یک سوال در مورد RMI درejb3 کردم و خواستار کمک شدم و دوست عزیز که من اسم واقعیشم نمی دونم جناب آقا اگر اشتباه نکنم آفای mazdadoost کلی به من کمک کردن و خیاله من و راحت کرد به عبارتی. منتها از اونجایی که واقعا نمی دونم چرا که انیجوری شد تمام پیغامها بین من و ایشون بصورت private رد و بدل شد. بعد از اون که مشکل حل شد تصمیم گرفته بودم که این رد و بدل نظرها رو توی تالار مطرح کنم که خوشبختانه خود جناب mazdadoost هم بدون اینکه من بگم به ایشون، گفتن که مطرح بشه که بدر دیگران ممکنه بخوره.

قبل از اینکه وارد داستان بشم قبلش یک توضیج مختصر در مورد JNDI(Java Naming and Interface وRMI(Remote Method Invocation) بدم بلکه شاید بعضی ها که اطلاعا تشون در مورد این دو تکنولوژی جاوا کم هست یا اصلا نمی دونند چیست، کمی اطلاعات بدم.(حتما بعدش به یک کتاب مرجع مراجعه کنید توضیحات من ناقض است)

در مورد jndi همه ماها چه جاوا کار چه غیر جاوا کار با naming آشنا هستیم.
توی windows وقتی می خواهیم به یک فلدر یا یک فایل دسترسی داشته باشیم باید به سراغ نام اون فلدر یا فایل بریم و برای رفتن به سمت اون بایند از طریق آدرس عمل کنیم. استفاده از \ درwindows نشان دهنده یک نوع نام گذاری است برای اینکه بتونیم اسم ها رو از هم تفکیک کنیم تا به فایل یا همان object مورد نظر بریسم. مثلا در سیستم عاملهای linux از علامت / بجای \ در ویندوز استفاده می شه یعنی میخوام بگم که روش نام گذاری متقاوت هست. خوب حالا توی جاو به چه درد می خوره. معمولا ما تما متدود ها و کلا object هایی که میخواهیم به اونها دست رسی داشته باشیم در کامپیوتر خودمون ذخیره کرده وبعد از اینکه در classpath خود آدرس دهی کردیم از اونها به راحتی استفاده می کنیم. و شاید هیچ وقت نیازی به نام دهی توی برنامه نداشته باشیم و با استفاده از . به object مورد نظر که در classpath هست دسترسی داریم.

حالا مجبور می شم یه قدم جلوتر برم و به سراغ RMI برم یعنی متدود هایی که در یک محل دیگر هستند و یا راحتر بگم در کامپیوتر ما و در classpath ما نیستند. مثلا در یک کامپیوتر دیگر. حالا چه باید کرد. ما objectی داریم که در یک کامپیوتر دیگر هست و ما نیاز داریم از آن استفاده کنیم. مثلا متدودی داره که کاره محاسبه حقوق کارمندان رو می کنه. ما می خواهیم برفرض اطلاعات بدهیم به اون متدود و اون برامون جواب برگردونه. روش چیست.
اینجاست که استفاده از RMI و naming به داد می رسه. که من خودنشو به عهده علاقه مندان میزارم.

اما باز یک قدم جلوترتر می روم و می رم سراغ ejb یا هما enterprise java bean همانطور که می دونیم در جاوا بر خلاف دیگر تکنولوژی ها مانند corba و یا .net ما سه نوع bean داریم
که عبارتند از
stateless bean
statefull bean
message driven bean
شایان ذکر که باقی تکنولوژی ها generic bean فقط دارند. (حتما خودتان بیشتر مطالعه کنید.)
در ejb2.X و پایین تر beans های ما همگی به صورت serialization بودند و می تونستد بصورت local و یا remote باشند. یا هردو. شایان ذکر است که در ejb3 هم چنین وضعیتی وجود دارد اما با این تفاوت که درساختن بسیار ساده شده. همانطور که باز می دانیم ejb یک کامپوننت است. یا به عبارتی مجموعه ای از چند object هست که به محیط بیرون از خودشون وابستگی ندارند. پس ما دیگر object oriented برنامه نمی نویسم بلکه داریم component نویسی می کنیم.(حتما خودتون مطالعه کنید این اطلاعات بسیار ناقص است)

در ejb3 از استیل pojo استفاده شده یعنی شما با یک کلاس و یک اینترفیس ساده واستاندارد جاوا می تونیم یک ejb component ایجاد کنید برعکس نسخه های قبل که مثلا باید کمه کم ۶ تا object رو کنار هم می زاشتید یعنی درست می کردید تا یک ejb component درست کنید اما در ejb3 همانطور که گفته شد مینیمم با ۲ object می تونید این کار رو انجام بدید البته annotation ها رو دسته کم نگیرد که بسیار در این امر ساده سازی کمک کردن و می شه گفت خیلی کاره هستند.(حتما مطالعه کیند از یک کتاب مرجعه این اطلاعات ناقص و کم است).

اما داستان از اینجایی شروع شد که من همانطور که اشاره کردم یک سری bean component داشتم که در سرور بودند و همگی به صورت remote یعنی قابلیت remote رو براشون تعریف کرده بودند. من می خواستم از طریق یک سری application که با java نوشته شده بود ودر کامپوترهای client بودن از متدود های remoteها استفاده کنم. و از طرفی هم می خواستم از یک سر تنظیمات هم فرار کنم. کسانی که با ejb3 کار کردند متوجه منظور من می شوند.
اما از اونحایی که شک داشتم که می شه فرار کرد یا نه بلاخره فهمیدم نه نمی شه وباید یک جورایی context رو initial کرد.

اینجا جا داره از دوست عزیز Mazdadoost باز تشکر کنم و بهشون بگم که من به سراغ JMS و message Driven bean رفتم که کارایی رو بالا تر ببرم.
بدم نمی یاد یه بحث خوب و درست حسابی بین JNDI وJMS ورابطه RMI با این دورا در این تالار راه بندازیم
چاکر شما بابک

mazdadoost
چهارشنبه 12 تیر 1387, 08:31 صبح
با سلام و عرض تشکر :
دوست عزیز javaphantom از لطفتون کمال تشکر رو دارم.
یه سوال هم برای من پیش اومد :
در EE5 و گلاس فیش آیا با Annonation میشه ریسورس های JMS مثل تاپیک ها یا صف هایی که تعریف کردیم یا MDB ها رو در خارج از سرور EE در کد Client به اصطلاح Inject کرد؟همون وضعیتی که با EJB های معمولی داشتیم؟ من فکر میکنم در این حالت هم باید کل اون قضایایی رو که دنبال کردیم برای این کار بکنیم.راه حل جدیدی پیدا کردید؟میشه بدونم؟
ظاهرا تنها مرجعی رو که میشه خارج از یه سرور در یه سرور دیگه بش دسترسی داشت وب سرویس های EE5 هستند!ببین:

@WebServiceRef(wsdlLocation ="http://198.85.14.1:8080/calculatorservice/" +
"CalculatorService?wsdl")
البته این هم کلی متاسفانه مقدمه چینی میخواد!
بازم از لطفت ممنونم.
موفق باشی.

fkohantorabi
دوشنبه 17 تیر 1387, 05:16 صبح
با سلام و عرض تشکر :
دوست عزیز javaphantom از لطفتون کمال تشکر رو دارم.
یه سوال هم برای من پیش اومد :
در EE5 و گلاس فیش آیا با Annonation میشه ریسورس های JMS مثل تاپیک ها یا صف هایی که تعریف کردیم یا MDB ها رو در خارج از سرور EE در کد Client به اصطلاح Inject کرد؟همون وضعیتی که با EJB های معمولی داشتیم؟ من فکر میکنم در این حالت هم باید کل اون قضایایی رو که دنبال کردیم برای این کار بکنیم.راه حل جدیدی پیدا کردید؟میشه بدونم؟
ظاهرا تنها مرجعی رو که میشه خارج از یه سرور در یه سرور دیگه بش دسترسی داشت وب سرویس های EE5 هستند!ببین:

@WebServiceRef(wsdlLocation ="http://198.85.14.1:8080/calculatorservice/" +
"CalculatorService?wsdl")البته این هم کلی متاسفانه مقدمه چینی میخواد!
بازم از لطفت ممنونم.
موفق باشی.

من جواب دقیقت رو نمی دونم ولی اگر هم نشه به هر حال می تونی به عنوان یک jndi resource دسترسی بهشون داشته باشی.


فرزاد-

fkohantorabi
دوشنبه 17 تیر 1387, 05:22 صبح
قبل از اینکه وارد داستان بشم قبلش یک توضیج مختصر در مورد JNDI(Java Naming and Interface وRMI(Remote Method Invocation) بدم بلکه شاید بعضی ها که اطلاعا تشون در مورد این دو تکنولوژی جاوا کم هست یا اصلا نمی دونند چیست، کمی اطلاعات بدم.(حتما بعدش به یک کتاب مرجع مراجعه کنید توضیحات من ناقض است)


در این مورد یک چیزی به ذهنم رسید که شاید بدرد بخوره و اون اینه که ejb calls over rmi یکم پر حجم هستن و تو مواردی که تعداد فراخوانی بالا باشه روی شبکه های نصبتا کند خودشون رو نشون می دهند. اگه خواستی می تونی wireshark رو نصب کنی و ببینی که توی یک اجرای برنامت چقدر دیتا رو شبکه ردوبدل می شه و اگه زیاد نبود که خوب مشکلی نیست.


فرزاد-

javaphantom
دوشنبه 17 تیر 1387, 12:26 عصر
در این مورد یک چیزی به ذهنم رسید که شاید بدرد بخوره و اون اینه که ejb calls over rmi یکم پر حجم هستن و تو مواردی که تعداد فراخوانی بالا باشه روی شبکه های نصبتا کند خودشون رو نشون می دهند. اگه خواستی می تونی wireshark رو نصب کنی و ببینی که توی یک اجرای برنامت چقدر دیتا رو شبکه ردوبدل می شه و اگه زیاد نبود که خوب مشکلی نیست.


فرزاد-

بسیار پیشنهاد جالبی بود حتما استفاده خواهم کرد اما در حاله حاضراز ejb pattern یعنی singleton و facade دارم استفاده می کنم برای کم کردن بار ترافیکی بین clientو سرور و همچنین کمک message driven beans .