# فناوری جاوا > برنامه‌نویسی جاوا > Java EE : نگارش سازمانی جاوا >  تاپیک مخصوص EJB

## handinux

سلام به تمامی دوستان در برنامه نویس خصوصا جاوا کارهای محترم در فروم.
مدتی ست که پس از فهمیدن مفاهیم بنیادی جاوا و نگارش استاندارد می خوام برم به سمت j2ee که دوستان متخصص عزیزم می دونند که ejb یکی از مهمترین مباحث این بخش هست من در سایت جستجو کردم اما آنچه که بتواند این مفهوم را دقیقا شرح دهد پیدا نکردم و چیزهایی که بود فقط ترجمه (آنهم به صورت نا مفهوم) از بحث بود. از منابع خارجی که اتفاقا زیاد هم هست چیزی نفهمیدم . و به نظرم این تاپیک می تواند تبدیل به یک مرجع فارسی برایش بشود.از تمامی دوستانی که تجربه دارن و مدیران خواهش می کنم خیلی خیلی ساده توضیح بدن راجع بهش .لازمه بگم که منظور آوردن مثال با سورس کد در همان ابتدا نیست ! اگرچه لازم است! می خوام مفهوم EJB خیلی ساده توضیح داده بشه و مزایاش گفته بشه بعد ان شاالله بریم سراغ نمونه.در واقع می خوایم فلسفه EJB توضیح داده بشه.فکر می کنم خیلی مفید باشه.پیشاپیش ممنونم از شما..

----------


## javaphantom

EJB مجموعه ای از چند فایل جاوای که در نهایت تشکیل یک مولفه یا component می کند. وقتی صحبت از componet می کنیم اون موقع باید صحبت از برنامه نویسی کامپونتی نیز بکنیم. تعریف کامپونت چیه؟ واقعا componet هم مانند تعریف object در دهه های 70 تا 80 امروزه بسیار سخت و نا مفهوم به نظر می رسه اما به زبان ساده می شه اینطور تعریف کرد که کامپونت مجموعه ای از چند object هست که به محیط خارج از خودش هیچ وابستگی نداره. شما در زبانهای visual بسیار از این کامپونت ها استفاده کرده این مسله JButton یک کامپونت هست که از چندین object مختلف یا حتی کامپونتهای دیگه استفاده شده ولی موجودیت جداگانه برای خودش داره. ejb هم همانطور که گفته شد مجموعه ای از چند محصول مختلف جاوایی یا همان object های جاواست. صحبت از این همه object توی هم باشه ولی مدیریت نداشته باشیم ؟ این کامپونت ها همه در قسمت server اجرا می شن پس نیاز به یک نرم افزار دیگه داریم تا مدیریت فرایند تولید و چیدمان این کامپونت ها را بر عهده داشته باشه. دقیقا ما ظرفی در قسمت سرور می خوایم که این کامپوننت ها درون اون بریزیم تا اون بتونه طول عمر و نحوه گردش این کامپونت ها رو مدیریت می کند که به آن ejb Container می گویند. این تکنولوژی در حال حاضر برای ایجاد برنامه های سازمانی یا همان Enterprise بسیار استفاده می شود تازه تمام تکنولوژی های قبل خودشم از جمله CORBA رو نیز پشتیبانی می کند در نسخه های قبلی آن ۱.۲ تا ۲.۱ این تکنولوژی بسیار پیچیدگی های خاصه حودشرو داشت در نتیجه شرکت های مختلف شروع به ساختن framework هایی کردند که بتواند برای تولید این نوع کامپونت ها بسیار سریع عمل کنه اما خوب استاندارد برای سان نبود از جمله struts , spring با اومدن آخرین نسخه آن یعنی ejb3 دیگر این مشکلات هم حل شد. ejb3 با شعار POJO Plain Old Java Object و همچنین با کمک annotation که جای گزین فایلهای عظیم xml شد دیگر واقعا کار را بسیار آسان کرد و هشتداری بود برای framework بازها.

----------


## saeed_Z_F

سلام
در مورد annotation یک نکته بگم که با وجود آسان سازی توسعه با استفاده از annotation یکی از ضعف های آن که باعث شده هنوز خیلی از xml در EJB استفاده کنند اینه که :
کدی که با annotation نوشته میشه با meta data ی خود گره میخوره و اگر شما کلاس رو کامپایل کنی و نخواهید دوباره کد کلاس رو کامپایل کنید reuse ability پایین میاد .
ولی اگر از xml استفاده کنید چون meta data از کد کلاس جدا هست reuse ability بالاتره .

----------


## handinux

از هر دو شما تشکر می کنم.خب من راجع به Bean ها می دونستم اما اینکه چطور در jee استفاده می شن چیزی نمیدونم بچه ها.این از این مرحله.حالا لطف کنید و یه مثال(نه سورس کد)از کاربرد آن بزنید.یک مثال نموداری یا بهتر بگم روند کار که استفاده از EJB مفهوم بشه.یعنی توی این مثال مفاهیمی  مثل Container  و یا چرخه حیات و هر چیزی که لازم هست و باید دونسته بشه ...دست شما درد نکنه

----------


## javaphantom

> سلام
> در مورد annotation یک نکته بگم که با وجود آسان سازی توسعه با استفاده از annotation یکی از ضعف های آن که باعث شده هنوز خیلی از xml در EJB استفاده کنند اینه که :
> کدی که با annotation نوشته میشه با meta data ی خود گره میخوره و اگر شما کلاس رو کامپایل کنی و نخواهید دوباره کد کلاس رو کامپایل کنید reuse ability پایین میاد .
> ولی اگر از xml استفاده کنید چون meta data از کد کلاس جدا هست reuse ability بالاتره .




خیلی ها کیا هستند؟ این آمار رو از کجا آوردین؟

annotation خودش metadata هست . حالا اصلا metadata چیه؟ با metadata خودش گره خورده یعنی چی؟
اول از همه، استفاده از descriptor  یا همان xml فایلها در ejb3 بصورت optional هست یعنی شما بازهم می تونید xml فایل بسازید یا اگر نخواستید نسازید.
بعدشم انگیزه سان از ایجاد چنین کاری یعنی POJO و استفاده کردن از annotation بجای فایلهای عظیم xml 
1 بالا بردن reusablity 
2 استفاده از فریم ورک استاندارد EJB3 بجای framework های غیر استاندارد مثل spring
3 راحتی کار و قدرت بالای annotation ها بود است.

اصلا annotation چی هست؟
چه جوری توی java standard از اون استفاده کنیم؟

----------


## javaphantom

> از هر دو شما تشکر می کنم.خب من راجع به Bean ها می دونستم اما اینکه چطور در jee استفاده می شن چیزی نمیدونم بچه ها.این از این مرحله.حالا لطف کنید و یه مثال(نه سورس کد)از کاربرد آن بزنید.یک مثال نموداری یا بهتر بگم روند کار که استفاده از EJB مفهوم بشه.یعنی توی این مثال مفاهیمی  مثل Container  و یا چرخه حیات و هر چیزی که لازم هست و باید دونسته بشه ...دست شما درد نکنه


کتاب خوندن هم راه حل مناسبی هست از نظر من.
مفهوم web و web application و .... چیزهایی هستند که به این راحتی نمی شه در موردشمون صحبت کرد.
کتاب هست که می تونه مفهومی به شما ایده بده.

----------


## handinux

Sams Teach Yourself J2EE in 21 Days
به نظر شما این کتاب خوب هست؟  توش از اول EJB رو هم گفته .یعنی سعی کرده همه تکنولوژِی ها رو بگه...خوبه؟
واقعا مثال نمی شه زد ؟؟!!

----------


## saeed_Z_F

> Sams Teach Yourself J2EE in 21 Days
> به نظر شما این کتاب خوب هست؟  توش از اول EJB رو هم گفته .یعنی سعی کرده همه تکنولوژِی ها رو بگه...خوبه؟
> واقعا مثال نمی شه زد ؟؟!!


سلام
چون EJB 3 تفاوت های زیادی با نسخه های قبلی داره و فرایند یادگیری در اون سریعتره به نظر من با EJB3 شروع کنی راحتتری .

----------


## handinux

بسیار ممنونم.اگر لطفی کنید و منبع خوب معرفی کنید و آیا منبع بالا که گفتم مناسب نیست؟

----------


## javaphantom

اگر نظر من رو بخوای من نمی گم هیچ کتابی بد هست ولی می گم یک کتاب هم کافی نیست
همه کتابها ارزش دارند و حرفهایی برای گفتن. اگر می خوای زود به نتیجه برسی از من به شما نصیحت که موفق نخواهی شد.
من قبول ندارم که این قدیمی هست و اون جدید. شما وقتی با ejb2.1 کار کنید یا حداقل یک بار بخونیش وقتی سراغ ejb3 رفتی می فهمی داستان چی بوده. البته تا حدی هم با نظر دوستامان موافق هستم که مستقیم بروید به سراغ ejb3 ولی مفهوم به هیچ عنوان تغییر نکرده. 
بازم می گم این نظر شخصی من هست

----------


## handinux

به هیچ وجه قصد ندارم ره صد ساله را دریک شب طی کنم.می خوام حرفه ای بشم.ممنونم.ولی یادتون باشه مثال نزدیدهاااااا !

----------


## javaphantom

من کلی کتاب در مورد جاوا دارم که حتی اگر راستشم بخوای هم رو نخوندم یا از هر کدوم یک بخش خواصی رو انتخاب کردم که احساس کردم بهتر توضیح داده می دونی بعضی وقتها هم شوده که کتاب یا فصلی رو کامل خوندم ولی هنگام پیاده سازی به مشکل بر خوردم که یا دلیل رعایت نکردن پیش نیازهای اون فصل بوده یا سرسری خوندن اون بخش یا حتی توقع بیش از حد توان و تجربه اینهارو گفتم که بدونی باید درگیر بشی و عذاب بکشی اما خوب من همیشه به راهنمایی های یک آدم باتجربه اعتقاد دارم ولی کو. باید خیلی خوش شانس باشی که همچین آدم یا آدمهایی رو پیدا کنی.
لیست کتاب
MasteringEJB2
Core-Servlets-and-JSP
Sun Microsystems Enterprise JavaBeansTM,Version 3.0
Manning - Ejb 3 In Action (2007)
Wiley.Mastering.Enterprise.JavaBeans.3.0.4th.Editi  on.Jul.2006
این آخری از نظر من بیشتر خوبه

----------


## sky_in_iran

سلام
من تو ejb3 در اجرای برنامه client به مشکل خوردم و بعد از اجرا exception میده که :Cannot connect to ORB چه جوری می تونم این مشکل و حل کنم و orb چیه ؟

----------


## javaphantom

> سلام
> من تو ejb3 در اجرای برنامه client به مشکل خوردم و بعد از اجرا exception میده که :Cannot connect to ORB چه جوری می تونم این مشکل و حل کنم و orb چیه ؟


در قسمت ست کردن properties هایی که قرار است با سرور صحبت کنه مشکل داری.

بگو از چه وب سروری استفاده می کنی و بعد ورژن ejb د نهایت کد سمت client رو بزار تا بحت بگم

----------


## sky_in_iran

از ejb3 استفاده می کنم سرورمم jboss-5.1.0.GA اینم کدم :

 
import javax.ejb.*;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.io.*;

public class SlessAppClient {

    //private static @EJB NewSessionRemote sless;
    public static void main(String args[]){
        Properties props = new Properties();
        props.setProperty("java.naming.factory.initial","c  om.sun.jndi.cosnaming.CNCtxFactory");
        props.setProperty("java.naming.factory.url.pkgs","  org.jboss.naming:org.jnp.interfaces");
        props.setProperty("java.naming.provider.url", "iiop://localhost:1099");
        try{
        //props.load(new FileInputStream("D:\\Documents and Settings\\Tanha\\Desktop\\EJB\\EJBModule3\\build\\  jar\\ejb30\\jndi.properties"));        
        Context context=new InitialContext(props);
        Object obj=context.lookup("ejb30.NewSessionRemote");
        NewSessionRemote sless=(NewSessionRemote) obj;
        System.out.println("Sless bean says : " + sless.hello());
        }
        catch (Exception e) {
            System.out.println("Exception step : " +
                               " " + e.getMessage());
        }
    }
}

----------


## javaphantom

> از ejb3 استفاده می کنم سرورمم jboss-5.1.0.GA اینم کدم :
> 
>  
> import javax.ejb.*;
> import java.util.Properties;
> import javax.naming.Context;
> import javax.naming.InitialContext;
> import java.io.*;
> 
> ...


java.naming.factory.initial=org.jnp.interfaces.Nam  ingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming.clie  nt 

در قسمت setProperty اینا رو قرار بده  خودت که می دونی جای مساوی باید ویرگول بزاری و و و

----------


## sky_in_iran

در قسمت setProperty قرار دادم اجرا کردم این بار این Exception  داد:
Cannot instantiate class: org.jnp.interfaces.NamingContextFactory

----------


## sky_in_iran

من برای رفع Exception : Cannot instantiate class: org.jnp.interfaces.NamingContextFactory فایل 
jbossall-client.jar به library اضافه کردم Exception که گفتم رفع شد حالا باز یک Exception دیگه میده 
فایل remote پیغام  not bound میده این و چه جوری حل کنم ؟ در ضمن کار اولم برای رفع  Cannot instantiate class درست بوده ؟

----------


## javaphantom

> من برای رفع Exception : Cannot instantiate class: org.jnp.interfaces.NamingContextFactory فایل 
> jbossall-client.jar به library اضافه کردم Exception که گفتم رفع شد حالا باز یک Exception دیگه میده 
> فایل remote پیغام  not bound میده این و چه جوری حل کنم ؟ در ضمن کار اولم برای رفع  Cannot instantiate class درست بوده ؟


مهندس من نیاز به این دارم که شما کامل exception رو برام بفرسی. تا من بتونم کمکت کنم.
در مورد قسمت اول درست رفتی حتما jar فایلش به classpath شما معرفی نشده بوده که شما معرفی کردین. در مورد این یکی هم باید همین اتفاق افتاده باشد. یا اگر ممکنه همه exceptionرو یک زحمتی بکش copy - paste کن. دست درد نکنه.
شاید wep appet داره روی یک port دیگه listen می کنه تنظیمات jboss رو  چک کن.

----------


## sky_in_iran

استاد من چک کردم  portam رو 1099 بعد IP رو localhost هست exception  اینه :
Exception in thread "main" javax.naming.NameNotFoundException: EjbtestBean not bound
at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
at org.jnp.server.NamingServer.lookup(NamingServer.java:267)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandl  er.run(TCPTransport.java:707)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceiv  edFromServer(StreamRemoteCall.java:247)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
at javax.naming.InitialContext.lookup(InitialContext.java:351)
at Test.client.main(client.java:25)

----------


## javaphantom

> استاد من چک کردم  portam رو 1099 بعد IP رو localhost هست exception  اینه :
> Exception in thread "main" javax.naming.NameNotFoundException: EjbtestBean not bound
> at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
> at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
> at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
> at org.jnp.server.NamingServer.lookup(NamingServer.java:267)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> ...


الان داستان اینکه آدرس ejbbean  رو  داری اشتباه می فرسی براش

سوال : ejb bean تو  stateless هست یا stateful 
آیا  local هست یا remote

احتمال می دم که remote باشه و stateless باشه

تا اونجا که یادم توی jboss وقتی داره توی context داری object رو می گیری باید به این فرم صدا به beanName/remote
اگر local باشه beanName/local
برای کار تو این جوری می شه ejb30/NewSessionRemote/remote

در ضمن استاد خودتی

----------


## sky_in_iran

بله  Stateless  و Remote هستش . تو context همینی که شما می فرمایید و گذارشتم  اما هر چی میذارام not bound میده مثلا اگه ejb30 یا remote یا bean فرقی نداره به هر سه exception میده لازم نیست تنظیم خاصی تو jboos انجام بدم ؟ یا کاره خاصی یا فایل خاصی یا xml خاصی نمی دونم نیازی به اینا هست ؟ اگه یک project نمونه کوچیک داری بزاری ببینم ممنون میشم .! ("اینم بگم اگه من مهندسم شمام استادی") ممنون استاد

----------


## javaphantom

> بله  Stateless  و Remote هستش . تو context همینی که شما می فرمایید و گذارشتم  اما هر چی میذارام not bound میده مثلا اگه ejb30 یا remote یا bean فرقی نداره به هر سه exception میده لازم نیست تنظیم خاصی تو jboos انجام بدم ؟ یا کاره خاصی یا فایل خاصی یا xml خاصی نمی دونم نیازی به اینا هست ؟ اگه یک project نمونه کوچیک داری بزاری ببینم ممنون میشم .! ("اینم بگم اگه من مهندسم شمام استادی") ممنون استاد


به جان عزیزت نه وقتشرو دارم نه حالش ولی تو اون jar فایل همراه با source بزار اینجا تا ببینم چه کردی . شاید سریع بشه درستش کرد  :چشمک: 
خیلی درگیرم به خدا ولی تو بزار. بدم نیست بلکه یکی دیگه هم پیدا بشه کمک کنه.
توی این فروم کمتر کسی مثل تو پیدا می شه. شاید سالی یکی. مردم بس که مزخرف دیدم توی این سایت حالا یکی مثل تو پیدا شده دست خالی سعی می کنم نره

----------


## amin-sadeghi

سلام دوست عزیز
در مورد annotation باید بگم که با نظر javaphantom موافقم.در مورد کتابی که معرفی کردی باید بگم که تمام کتاب هایی که به این صورت است (XXX in 21 days) بدرد شما نمی خوره. من پیشنهاد می کنم از کتاب های زیر استفاده کنی:
Manning EJB3 in Action Apr 2007
Enterprise JavaBeans 3.0 5th Ed 2006
می تونی این کتاب ها رو در سایت www.4shared.com جستجو و دانلود کنی.
اینم کلی مثال با دستورالعمل که برای کتاب اولیه:(البته با اجازه استاد)
www.manning.com/panda
مثال هاشو دانلود کن.برای سرور های متفاوت مثال گذاشته.

----------


## sky_in_iran

دستت درد نکنه استاد ممنون میشم یه نگاه بندازی و راهنمایی کنی خیلی به این موضوع نیاز دارم منتظره پاسخ شما هستم بازم سپاسگزارم

----------


## javaphantom

فایل client رو از jar فایل بیارش بیرون و خارج از container اجراش کن نیازی نیست که توی jar فایلت باشه

----------


## sky_in_iran

:ناراحت: ستاد کاری که فرمودی و انجام دادم اما بازم همون پیغام not bound میده نمیدونم اشکالم کجاست یا کجارو اشتباه دارم میرم اما این برنامه رو تو jboss 5.1 اجرا کردم client از container بیرون آوردم پیغامش شد java.lang.Exception: No runnable methods + Test  client FAILED اما تو jboss 4.2 پیغام not bound میده چه کنم یه ماه بیشتره درگیرم از کجا می تونم یه project اماده بردارم تست کنم ؟؟؟؟؟؟؟؟؟
خیلی لازم دارم لطفا کمک کنید استاد!!!!!!!؟؟؟؟؟؟؟؟؟؟؟

----------


## javaphantom

این عذابی که داری می کشی برای من یادآور خاطرات چند سال پیشم می شه که داستانی بس دراز دارد. اما دیگه منو مجبور کردی که دست به کد بشم و یک مثال خیلی کوچیک برات درست کنم که در آخر کار یک jar فایل به تو می دم که باید اینو بندازیش توی ejb container ت یعنی اینکه deploy کنیش تا واقعا ببینی داستان در عمل چیه.
اما چند نکته که من توی خونه و روی laptopم متاسفانه JBOSS نداشتم ولی با glassfish تست کردم و چون نتیجه کار اساندارد هست پس باید روی هر ejb containerی deploy بشه.
اما در قسمت client باید اینو بهت بگم که داستان jndi properties فرق می کنه یعنی برای jboss یک چیز و برای glassfish چیزه دیگه تعریف شده. ولی اینها مهم نیست مهم اینه که تو بتونی درست deploy کنی همین.

قبل از هر چیز می رم سراغ چند concept مهم توی ejb که می دونم تو بلدی و استاد هستی توش ولی می گم که بدونی دارم درسم رو به تو پس می دم و یک یادآوری بشه برای بقیه استاتید این فروم که بد نیست. 

EJB container یک ظرف هست که فقط ejb ها رو می شناسه که کارشون چیه business های خیلی پیچیده رو یا نه ممکنه پیچده هم نباش رو مدیریت می کنه. مثل servlet container که فقط کارش اینه که از servlet ها مراقبت و مدیریت کنه. حالا ما وقتی می خواهیم با servlet صحبت کنیم بایک protocol به نام Http صداشون می کنیم یعنی مثل اینکه می خواهیم توی windows بگیم  مثلا  c:\myfolder\runme.exe در قسمت آدرس بار یک browser با این ترتیب عمل می کنیم که با protocol ی که Http هست برو به فلان سرور با یک آدرس port و بعد برو فلان servlet یا فرقی نداره فلان jsp که منظور همان servlet هست برو برام بیار.

خوب الان همه کاربرها چه با سواد چه بی سواد این کارهارو انجام می دن اما در اصل پشت ماجرا داستان چیزه دیگست.
داستان در حالت کلی به دوقسمت یا دو  concept اصلی تبدیل شده 
یک  remote
دو address naming
اولی یعنی اینکه با توی windows تو فایل اجرایی رو داری توی کامپیوترت آدرس می دی مثلا و تو وب که داستان این نیست داری از یک کامپیوتر دیگه تقاضا می کنی اینجا به این عمل می کن داری remote می زنی. RMI در جاوا یعنی اینکه از یک JVM با یک JVM دیگه رابطه داشته باشی و بتونی از او JVM هر object ی که بخوای بر داری بیاری توی jvm خودت.
 خوب object ها که بدون اسم نمی شن اینجاست که باید بری سراغ اسم object و تقاضا کنی بگی بیا بابا اینجا مثل وب پس بحث JNDI یا java name and directory بوجود می آیاد.

بر گردیم سراغ ejb حالا دقیق این داستانها در ejb  هم همینه. اما چه جوری. تو می ری اون object هایی که قرار بقیه از بیرون بیان صداشون کنن رو درست می کنی یکی یک اسمم بهشون می دی می ندازیش توی ejb container یعنی deploy می کنی این container گوش بزنگه کی چی می خواد کی کی می خواد  و و و و.

داستان اینه که یک interface درست می کنی که هم باید client و هم server داشته باشه.
بعد توی قسمت server هر کی هر جور که دوست داره می یاد اون interface رو implement می کنه بعد یک اسم هم بهش می ده یکی اسمشو می زاره    عنقذی یکی دیگه می زاره babakHelloBeanImpl اما چون همه اون interface اصله کاری رو implement کردن و server مطمعن هست که در قسمت client هم هست پس کافی که چی، به clientها بگه من این interface رو دارم که توام داری تازه این چندتا implement شده هشم داره. حالا client فقط کافی هست که چی کار کنه ؟؟ رفتیم سراغ javaSE بیاد از کلاس دلخواه implement شده به interface موجود در کلاینت چی cast کنه و نتیجه رو بگیره. مام همین کار رو می کنیم.

package myejb;

import javax.ejb.Remote;

/**
 *
 * @author root
 */
@Remote
public interface HelloRemote {

    public String sayHello();
    
}

 package myejb;

import javax.ejb.Stateless;

/**
 *
 * @author root
 */
@Stateless(mappedName="babakHelloBeanImpl")
public class HelloBean implements HelloRemote {

    public String sayHello() {
        return "Hello";
    }    
 
}


دقت کن یک interface هست که من اومدم implemntش کردم و یک نام بهش دادم که از بیرون هرکی این نام رو صدا کنه به این object دسترسی داره یعنی babaHelloBeanImpl و کسی دیکه می تونه طور دیگه implement کنه  ویک نامه دیگه بزاره براش.

داستان به همین راحتی بود . یک jar فایل می دی بیرون و می ندازیش توی container
وقتی میندازیش یعنی deploy می کنی اگر مشکلی نباشه خودت توی console می بینی یک همچین پیعامی برات می نویسه

CORE5024: EJB module [MyEJB] unloaded successfully!
PWC4011: Unable to set request character encoding to UTF-8 from context , because request parameters have already been read, or ServletRequest.getReader() has already been called
deployed with moduleid = MyEJB
**RemoteBusinessJndiName: babakHelloBeanImpl; remoteBusIntf: myejb.HelloRemote
LDR5010: All ejb(s) of [MyEJB] loaded successfully!


خوب حالا jboss بالاست  و jar فایلت deploy شده توش و منتظر جواب دادن. می ریم سراغ client که می خواد از این object یا بهتر بگم interface ی که باید یک نسخشم در client باشه ولی نیاز به classهای implement شده نیست وجود داشته باشه.

یک پروژه دیگه در client به این صورت

package clientside;

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import myejb.HelloRemote;




/**
 *
 * @author root
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        try {
            Properties properties = new Properties();

            System.out.println("befor");
            properties.setProperty("java.naming.factory.initia  l", "com.sun.enterprise.naming.SerialInitContextFactor  y");
            properties.setProperty("java.naming.factory.url.pk  gs", "com.sun.enterprise.naming");
            properties.setProperty("java.naming.factory.state"  , "com.sun.corba.ee.impl.presentation.rmi.JNDIStateF  actoryImpl");
            properties.setProperty("org.omg.CORBA.ORBInitialHo  st", "192.168.1.3");
            properties.setProperty("org.omg.CORBA.ORBInitialPo  rt", "3700");

            Context context = new InitialContext(properties);

            HelloRemote  helloRemote = (HelloRemote) context.lookup("BabakHelloBeanImpl");
            String s = helloRemote.sayHello();

            System.out.println("Babak says = " + s);



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

}


کار تمام.

نکات : در قسمت client تمام propertyی ها مخصوص glassfishهست نه jboss یا web app دیگری
دوم برای اینکه جا نبود من از lib فایلهایی که به classpath در دو پروژه یعنی server side و client side افزوده شده برای نمایش صرفه نظر کردم.

تنظیمات jboss رو از اینترنت بدست بیار

هنگام صدا زدن object باید joboss یا هر web app دیگر حتما  run باشه اگر ببندیش یعنی اینکه ejb containerx رو بستی پس ۱۰۰٪ در قسمت client هم جوابی نمی گیری

فقط قسمت ejb بصورت یک jar فایل هست و قابل deploy
قسمت client رو به عهده خودت می زارم  با این مثال کد

----------


## sky_in_iran

سلام عرض می کنم خدمت استاد شرمندم کردی خیلی بهت زحمت دادم انشا ا.. بتونم جبران کنم تمام مراحل رو همونجور که گفتید رفتم کامل با glassfish کار کردم نه jboss اما باز نوای گوش خراش Exception به گوش رسید اخه چرا چرا چرا ؟؟؟؟؟!!!!!
javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
        at javax.naming.spi.NamingManager.getInitialContext(N  amingManager.java:657)
        at javax.naming.InitialContext.getDefaultInitCtx(Init  ialContext.java:288)
        at javax.naming.InitialContext.init(InitialContext.ja  va:223)
        at javax.naming.InitialContext.<init>(InitialContext.  java:197)
        at clientside.Main.main(Main.java:37)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:  200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.j  ava:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:3  06)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launche  r.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:2  51)
        at java.lang.ClassLoader.loadClassInternal(ClassLoade  r.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at com.sun.naming.internal.VersionHelper12.loadClass(  VersionHelper12.java:46)
        at javax.naming.spi.NamingManager.getInitialContext(N  amingManager.java:654)
        ... 4 more

----------


## javaphantom

> سلام عرض می کنم خدمت استاد شرمندم کردی خیلی بهت زحمت دادم انشا ا.. بتونم جبران کنم تمام مراحل رو همونجور که گفتید رفتم کامل با glassfish کار کردم نه jboss اما باز نوای گوش خراش Exception به گوش رسید اخه چرا چرا چرا ؟؟؟؟؟!!!!!
> javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
>         at javax.naming.spi.NamingManager.getInitialContext(N  amingManager.java:657)
>         at javax.naming.InitialContext.getDefaultInitCtx(Init  ialContext.java:288)
>         at javax.naming.InitialContext.init(InitialContext.ja  va:223)
>         at javax.naming.InitialContext.<init>(InitialContext.  java:197)
>         at clientside.Main.main(Main.java:37)
> Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:  200)
> ...


هرچی jar فایل توی فلدر lib ی که glassfish داره رو سمت client  به classpath اضافه کن

----------


## sky_in_iran

استاد دیگه دارم دیوونه میشم من تمامی jar فایل هایی که تو مسیر javadb\lib البته تو glassfish فقط اونجا jar بود و کپی کردم به محل client باز نشد به library اضافه کردم باز نشد الان انقدر گیجم واقعا قاطی کردم  classpath دقیقا منظورت چیه میشه بیشتر توضیح بدی من بی سوادم ؟؟!!!!!!!!!!! :ناراحت:  :گیج:

----------


## sky_in_iran

ببخشید classpath منظور مسیر فایل های class بود درسته ؟ MyEJB\build\jar\clientside درسته ؟ اگه این باشه کپی کردم بازم Exception داد :
befor
javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
        at javax.naming.spi.NamingManager.getInitialContext(N  amingManager.java:657)
        at javax.naming.InitialContext.getDefaultInitCtx(Init  ialContext.java:288)
        at javax.naming.InitialContext.init(InitialContext.ja  va:223)
        at javax.naming.InitialContext.<init>(InitialContext.  java:197)
        at clientside.Main.main(Main.java:37)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:  200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.j  ava:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:3  06)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launche  r.java:276)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:2  51)
        at java.lang.ClassLoader.loadClassInternal(ClassLoade  r.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at com.sun.naming.internal.VersionHelper12.loadClass(  VersionHelper12.java:46)
        at javax.naming.spi.NamingManager.getInitialContext(N  amingManager.java:654)
        ... 4 more

----------


## javaphantom

> ببخشید classpath منظور مسیر فایل های class بود درسته ؟ MyEJB\build\jar\clientside درسته ؟ اگه این باشه کپی کردم بازم Exception داد :
> befor
> javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
>         at javax.naming.spi.NamingManager.getInitialContext(N  amingManager.java:657)
>         at javax.naming.InitialContext.getDefaultInitCtx(Init  ialContext.java:288)
>         at javax.naming.InitialContext.init(InitialContext.ja  va:223)
>         at javax.naming.InitialContext.<init>(InitialContext.  java:197)
>         at clientside.Main.main(Main.java:37)
> Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
> ...


شما توی مسیر glassfish یک فلدر داری به نام lib که توی اون یک عالمه jar فایل در کنار چند folder هست . اون jar فایل ها باید در مسیر classpath قرار بگیره چه جوری 
اگر داری از IDE خواصی استفاده می کنی کافی هست که به قسمت library ها بری و توی libarayی که  project ت داره این jar فایل ها رو add کنی.

اگر داری با console برنامه می نویسی و در windows هستی
باید با دستور   set CLASSPATH=%CLASSPATH%\c:\galssfish\lib\javaee.jar و هر چی jar فایل دیگه دیدی

اگر در linux یا open solaris داری کار می کنی با دستور 
export CLASSPATH=$CLASSPATH:/opt/galssfish/lib/javaee.jar:
و تا آخر. بعد compile کن با دستور  javac و بعد با دستور java اجرا کن

----------


## sky_in_iran

ببخشيد استاد يه شاگرد كم حافظه و تنبل گيرت اومده فكر كنم glassfish مشكل داره چون اصلا توش lib وجود نداره باز از وب download ميكنم تست مي كنم انشا ا.. حل بشه وگرنه باز من مزاحمه شما ميشم خيلي خيلي خيلي ممنونم از لطفتون

----------


## sky_in_iran

سلام استاد من واسه کارم از ide ، netbean استفاده می کنم ورژن 6.7.1 موقع نصب خودش glassfish 2.1 نصب می کنه اما تو مسیر lib هیچjar فایلی نیست به جز jndi-properties.jar اماتو مسیر sges-v3-prelude\javadb\lib یسری jar فایل هست که وقتی تو classpath گذاشتم باز exception داد :
befor
javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(N amingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(Init ialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.ja va:223)
at javax.naming.InitialContext.<init>(InitialContext. java:197)
at clientside.Main.main(Main.java:37)
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:3 06)
at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:2 51)
at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at com.sun.naming.internal.VersionHelper12.loadClass( VersionHelper12.java:46)
at javax.naming.spi.NamingManager.getInitialContext(N amingManager.java:654)
... 4 more
واقعا دیگه گیج شدم مشکل آخه از کجاست واقعا موندم ؟ چه باید کرد

----------


## javaphantom

> سلام استاد من واسه کارم از ide ، netbean استفاده می کنم ورژن 6.7.1 موقع نصب خودش glassfish 2.1 نصب می کنه اما تو مسیر lib هیچjar فایلی نیست به جز jndi-properties.jar اماتو مسیر sges-v3-prelude\javadb\lib یسری jar فایل هست که وقتی تو classpath گذاشتم باز exception داد :
> befor
> javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
> at javax.naming.spi.NamingManager.getInitialContext(N amingManager.java:657)
> at javax.naming.InitialContext.getDefaultInitCtx(Init ialContext.java:288)
> at javax.naming.InitialContext.init(InitialContext.ja va:223)
> at javax.naming.InitialContext.<init>(InitialContext. java:197)
> at clientside.Main.main(Main.java:37)
> Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
> ...



بابا این کار خیلی سادست جزو مفاهیم اولیه هر زبانی اینکه که بتونی از کتابخانه اون زبان استفاده کنی.

netbeans چیه. برو ببین که glassfish رو کجا نصب کرده. اونجا فلدر bin داره چندتا فلدر دیگه هم هست که یکیشون lib هست. که تمام jar فایلهای مربوط به javaee اونتو هست.

اونو پیدا کن

----------


## sky_in_iran

استاد چیزایی که میگیو بلدم اما مشکلم اینه که فولدر lib هیچ jar فایلی یا فایل کتابخونه ای نداره .توglassfish هر چی jar پیدا کردم به classpath اضافه کردم اما باز exception داد الان دیگه تماما مخم تعطیل شده مشکل از glassfish یا کد برنامه ؟؟؟؟؟؟ این سوالمه کدم همونیه که شما لطف کردید دادید رفتم از سایت glassfish یه بار دیگه دانلود کنم که خداروشکر در همه چیز تحریمیم و بهش افتخار می کنیم من چه کنم !!!!؟؟؟؟

----------


## mazdadoost

> استاد چیزایی که میگیو بلدم اما مشکلم اینه که فولدر lib هیچ jar فایلی یا فایل کتابخونه ای نداره .توglassfish هر چی jar پیدا کردم به classpath اضافه کردم اما باز exception داد الان دیگه تماما مخم تعطیل شده مشکل از glassfish یا کد برنامه ؟؟؟؟؟؟ این سوالمه کدم همونیه که شما لطف کردید دادید رفتم از سایت glassfish یه بار دیگه دانلود کنم که خداروشکر در همه چیز تحریمیم و بهش افتخار می کنیم من چه کنم !!!!؟؟؟؟


دوست عزيز : شما از jboss استفاده مي كنيد يا glassfish? اگر از glassfish استفاده مي كنيد بهترين راه به نظر من استفاده از *application* *client* است. به اين آدرس مراجعه كنيد .
http://docs.sun.com/app/docs/doc/820-4337/fvyal?a=view

موفق باشيد.

----------


## sky_in_iran

سلام استاد شرمنده تو این مدت خیلی اذیتت کردم آخر درست شد مشکلم تو classpath بود مسیر اشتباهی میرفتم خیلی خیلی ممنونم همیشه موفق و پیروز باشی

----------


## javaphantom

> سلام استاد شرمنده تو این مدت خیلی اذیتت کردم آخر درست شد مشکلم تو classpath بود مسیر اشتباهی میرفتم خیلی خیلی ممنونم همیشه موفق و پیروز باشی


من کار نکردم  :لبخند گشاده!: 

همه عزابش برای تو بود  :بامزه:

----------


## mohammadpft

سلام
من می خوام ejb رو شروع به یادگیری کنم از کجا باید آغاز کنم البته جاوا کارکردم لطف کنید راهنمایی نمایید

----------


## Syamah

> EJB مجموعه ای از چند فایل جاوای که در نهایت تشکیل یک مولفه یا component می کند. وقتی صحبت از componet می کنیم اون موقع باید صحبت از برنامه نویسی کامپونتی نیز بکنیم. تعریف کامپونت چیه؟.
> .
> .
> .
>  تمام تکنولوژی های قبل خودشم از جمله CORBA رو نیز پشتیبانی می کند در نسخه های قبلی آن ۱.۲ تا ۲.۱ این تکنولوژی بسیار پیچیدگی های خاصه حودشرو داشت در نتیجه شرکت های مختلف شروع به ساختن framework هایی کردند که بتواند برای تولید این نوع کامپونت ها بسیار سریع عمل کنه اما خوب استاندارد برای سان نبود از جمله struts , spring با اومدن آخرین نسخه آن یعنی ejb3 دیگر این مشکلات هم حل شد. ejb3 با شعار POJO Plain Old Java Object و همچنین با کمک annotation که جای گزین فایلهای عظیم xml شد دیگر واقعا کار را بسیار آسان کرد و هشتداری بود برای framework بازها.



پس میشه گفت جاوا یه جورایی Server Oriented رو با این EJB پیاده کرده و به راحتی میشه یه Application Server  راه انداخت . و یه جوایی شبیه تکنولوژی WCF در مایکروسافت 
(البته لازم به ذکر است که نمیشه چیزی مث مایکروسافت دات نت و با جاوا مقا یسه کرد چون مایکروسافت دانت در مقابل جاوا عددی نیس. )

----------


## homa19

یعنی می تونیم به کمک EJB با متد هامون به صورت آسنکرون ارتباط برقرار کنیم؟ آیا EJB ابزاری هست که برای این کار تعبیه شده؟ چه ابزارهای دیگه ای در جوا وجود دارند که انجام این کار رو عملی میکنند؟؟؟
ممنون میشم اگه با سورس جواب بدید

----------


## javaphantom

برای ارتباط آسنکرون باید بری سراغ مفاهیم  AMQP یا همون Advanced Message Queuing Protocol. در جاوا بحثی داریم  (Java Message Oriented Middleware) (MOM)  به عبارت ساده تر بحث JMS یا Java Message Service.
هر AMQP یک سری API به یک زبان خاصی دراختیار developer ها می زاره تا بتونن با هاش کار کنند. جاوا هم یک سری کتاب خونه استاندارد داره که می تونی مستقل از هر چیزی با یک AMQP  ارتباط بر قرار کنی. در EJB برای سهولت این کار اومدن بحث Message Driven رو مطرح کردن. در نهایت جواب شما بله هست. بله EJB این امکان رو به شما می ده که بتونید به راحتی با یک AMQP  جاوایی ارتباط برقرار کنی.

در مورد سورس هم منظورتون رو نفهمیدم ولی توی اینترنت در مورد rabbit mq or active mq or sun mq یک سرچ بزنی کلی در مورد message broker ها داستان هست و همچنین در مورد message driven در ejb

----------


## persianshadow

بله در EJB 3.1 و یا به کمک فریم ورک Spring به سادگی می‌تونید یک متد رو آسنکرون فراخوانی کنید. کافیه از Annotation مربوط به این کار یعنی Async@ و Asynchronous @ استفاده کنید.

----------

