PDA

View Full Version : فراخوانی ejb برای desktop



phoenix87
چهارشنبه 17 آذر 1389, 23:14 عصر
چطوری میتونم ejb رو از راه دور برای کلاینت که desktop application هست فراخونی کنم؟
ممنونم اگه راهنمایی کنید.

java_nith
پنج شنبه 18 آذر 1389, 04:42 صبح
برای استفاده از EJB در برنامه‌های DesktopAplication باید از InitialContext استفاده کنی‌
که تزشو اینجا یاد دادم،

تنها فرقش در کلاس Client است که اونجا از استفاده @EJB نمی‌شه و از InitialContext استفاده می‌شه

TimeRemote:


package myBeans;

import java.util.Calendar;
import javax.ejb.Remote;

@Remote
public interface TimeRemote {

public Calendar getTimeRemote();
}


Tme:


package myBeans;

import java.util.Calendar;
import javax.ejb.Stateless;

@Stateless

public class Time implements TimeRemote{

@Override
public Calendar getTimeRemote() {
Calendar now = Calendar.getInstance();
return now;
}

}


RemoteClient:


import java.util.Calendar;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import myBeans.TimeRemote;

public class RemoteClient {

public static void main(String [] args){


InitialContext look;
try {
look = new InitialContext();
TimeRemote nyBean = (TimeRemote) look.lookup("myBeans.TimeRemote");
Calendar beanTime = nyBean.getTimeRemote();
System.out.println("Now time is: " + beanTime.getTime().toString());

} catch (NamingException e) {
System.out.println(e.getMessage());
}

}

}

javaphantom
پنج شنبه 18 آذر 1389, 09:13 صبح
برای استفاده از EJB در برنامه‌های DesktopAplication باید از InitialContext استفاده کنی‌
که تزشو اینجا یاد دادم،

تنها فرقش در کلاس Client است که اونجا از استفاده @EJB نمی‌شه و از InitialContext استفاده می‌شه

TimeRemote:


package myBeans;

import java.util.Calendar;
import javax.ejb.Remote;

@Remote
public interface TimeRemote {

public Calendar getTimeRemote();
}


Tme:


package myBeans;

import java.util.Calendar;
import javax.ejb.Stateless;

@Stateless

public class Time implements TimeRemote{

@Override
public Calendar getTimeRemote() {
Calendar now = Calendar.getInstance();
return now;
}

}


RemoteClient:


import java.util.Calendar;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import myBeans.TimeRemote;

public class RemoteClient {

public static void main(String [] args){


InitialContext look;
try {
look = new InitialContext();
TimeRemote nyBean = (TimeRemote) look.lookup("myBeans.TimeRemote");
Calendar beanTime = nyBean.getTimeRemote();
System.out.println("Now time is: " + beanTime.getTime().toString());

} catch (NamingException e) {
System.out.println(e.getMessage());
}

}

}


جواب خروجی برنامه شما NullPointerException خواهد بود.

javaphantom
پنج شنبه 18 آذر 1389, 09:14 صبح
ما بحثی داریم به نام RMI و JNDI

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

phoenix87
پنج شنبه 18 آذر 1389, 18:11 عصر
مرسی از جوابتون منم مشکلم همیناست نمیدونم چه طوری jndi rmi چطوری مسیر application server که ejb که می خواد صداش کنه درش هست رو پیدا می کنه .تو کجا آدرس سرور رو می گیره؟
تو قسمت lookup می دونم باید اون bean که باهاش کار داره رو بنویسیم.اما چطوری ؟فقط کافیه اسمش رو بنویسیم؟
ممنونم چون گیر کارم همین آدرس دهیه؟ مثلا تو وب سرویس url رو راحت میدی.

java_nith
پنج شنبه 18 آذر 1389, 18:32 عصر
این بارنامه که من نوشتم EJB باید در سرور باشه مثل glassfish
وسحعٔ همین که NullPointerException میده

ولی‌ اگه می‌خوای از RMI هم استفاده کنی‌ باید از RMI registry که خودش هم یک نو سرور استفاده کنی‌

javaphantom
جمعه 19 آذر 1389, 10:00 صبح
این بارنامه که من نوشتم EJB باید در سرور باشه مثل glassfish
وسحعٔ همین که NullPointerException میده

ولی‌ اگه می‌خوای از RMI هم استفاده کنی‌ باید از RMI registry که خودش هم یک نو سرور استفاده کنی‌


خواهشا با راهنمایی های غلطتون سوال کننده هم گیج نکنید.

RMI و JNDI دو مفهوم کلی هستند. دلیل نمی شه وقتی صحبت از RMI شد حتما از RMI Registry هم صحبت بشه. این دو معقول جدا از هم از نظر مفهومی هستند.

شما وقتی قرار از یک JVM با یک JVM دیگه صحبت بکنی و به هم Object رد و بدل کنی می ری سراغ بحث RMI و JNDI. وقتی بحث از EJB می شه ممکن هست یا یکی از خاصیت های این تکنولوژی اینکه در یک JVM دیگری باشه و شما قرار هست اون رو به طریقی صدا کنید بس بصورت خودکار بحث RMI و JNDI دگیر هست.

اما چرا کد شما NullPointerException بر می گردونه. شما از context استفاده کردید. ولی درست استفاده نکردید. context شما چیزی توش مقدار دهی نشده که بخواد کار بکنه.

شما مفهوم EJB رو با چندتا کلاس و چندتا annotation نمی تونید سر و تهش رو بند بیارید. مفاهیمش خیلی وسعتر از این چندتا annotation هست.

جواب کلی. شما باید تعیین کنید که از چه ejb container ی دارید استفاده می کنید تا context رو بر اساس اون container بتونیم تنظیم کنیم. اون موقعه بقیه داستان شما کاملا درست می شه.

جسارت من رو ببخش دوست عزیز من فقط می خوام رفع سوتفاهم بسه.

البته که شما استاد بنده هستید

phoenix87
جمعه 19 آذر 1389, 12:47 عصر
فرض کنید می خوام ejb container که استفاده می کنم tomcat باشه
1.چه تنظیماتی تو context انجام بدم.
2.مشکل من تو بخش look up هست که چطوری مسیر رو بدم.

phoenix87
جمعه 19 آذر 1389, 13:05 عصر
Context ic = new InitialContext();
Object ejbHome = ic.lookup("java:comp/env/HelloBean");





اون مسیر رو بر چه اساسی تعیین کرده

javaphantom
جمعه 19 آذر 1389, 14:51 عصر
فرض کنید می خوام ejb container که استفاده می کنم tomcat باشه
1.چه تنظیماتی تو context انجام بدم.
2.مشکل من تو بخش look up هست که چطوری مسیر رو بدم.

tomcat یک servlet container هست نه یک ejb container.

شما بجایی که بری سراغ کد من به شما پیشنهاد می کنم که مطالعتون رو بیشتر کنید. اینطور که که نشون می ده شما مفاهیم پایه در مورد تکنولوژی که دارید کار می کنید رو به قدر کافی مسلط نیستید.

phoenix87
جمعه 19 آذر 1389, 17:59 عصر
بله درست میگین تو اون مقاله نمی دونم چرا نوشته بود که نسخه 7 ejb container هم شده.
به هر حال مشکلم تو همین مفهومه اون هم خوشبختانه چند کتاب 2010 بدستم رسید تونستم راحتر بفهمم نسبت به کتابای قدیمی.
ممنون که همراهی کردین.:تشویق: