ورود

View Full Version : سوال: مشکل عجیب در ejb



m44miri
دوشنبه 15 فروردین 1390, 10:10 صبح
یک مشکل جدید برام پیش اومده.
وقتی قصد دارم یک برنامه تحت وب enterprise بنویسم زمانی که ماژول ejb را در بخش وب import میکنم(منظورم فایل jar بخش ejb است) بخش وب دیگه deploy نمیشه و پیغام میده که The module has not been deployed
وقتی حذفش میکنم راحت deploy میشه.
مشکل چی میتونه باشه؟

javaphantom
دوشنبه 15 فروردین 1390, 10:19 صبح
یک مشکل جدید برام پیش اومده.
وقتی قصد دارم یک برنامه تحت وب enterprise بنویسم زمانی که ماژول ejb را در بخش وب import میکنم(منظورم فایل jar بخش ejb است) بخش وب دیگه deploy نمیشه و پیغام میده که The module has not been deployed
وقتی حذفش میکنم راحت deploy میشه.
مشکل چی میتونه باشه؟


تو کجا deploy می کنی؟

کل پیغام خطا رو هم برام بفرست

m44miri
دوشنبه 15 فروردین 1390, 10:34 صبح
In-place deployment at /media/sda7/Office Automation Persian correspondence/MyPrj/projectMaster/Weboapc/build/web
Initializing...
deploy?path=/media/sda7/Office Automation Persian correspondence/MyPrj/projectMaster/Weboapc/build/web&name=Weboapc&force=true failed on GlassFish Server 3
/media/sda7/Office Automation Persian correspondence/MyPrj/projectMaster/Weboapc/nbproject/build-impl.xml:692: The module has not been deployed.
خط ۶۹۲ هم اینه:
<target if="netbeans.home" name="-run-deploy-nb">
<nbdeploy clientUrlPart="${client.urlPart}" debugmode="false" forceRedeploy="${forceRedeploy}"/>
</target>
در netbeans 6.9.1 , glassfish 3.01

m44miri
دوشنبه 15 فروردین 1390, 10:59 صبح
جالبه که وقتی ماژول ejb را undeploy میکنم بخش web راحت deploy میشه اما بعد بخش سمت ejb در glassfish دیگه وجود نداره..
البته من دفعه اول که دارم برنامه enterprise تحت وب مینویسم .همون کارایی را کردم که تحت application انجام میدادم.شاید کار خواص دیگه ای هم باید انجام بدم؟!!!

javaphantom
دوشنبه 15 فروردین 1390, 12:20 عصر
جالبه که وقتی ماژول ejb را undeploy میکنم بخش web راحت deploy میشه اما بعد بخش سمت ejb در glassfish دیگه وجود نداره..
البته من دفعه اول که دارم برنامه enterprise تحت وب مینویسم .همون کارایی را کردم که تحت application انجام میدادم.شاید کار خواص دیگه ای هم باید انجام بدم؟!!!

روشهای مختلفی برای deploy کردن پروژه های enterprise هست. مشکل شماا هر چی هست از سمت فایل ant ی هست که ide شما درست کرده. اگر دارید با glassfish کار می کنی می تونی مستقیم از console خود glassfish که تحت web و بصورت browser هست استفاده کنی. قابل ذکر که اگر پروژه شما شامل دو ماژول web و ejb هست بهتر که محصول نهایی شما یک ear فایل باشه. به نظر من راه حل اساسی و ممکن استفاده از maven هست که اون موقع دیگه مو لای درزش نمی ره. شما می تونید یک پروژه جدید بسازید و دباره تست کنید.م مشکل از سمت ant فایلی هست که ide شما ساخته

omidbizdotcom
دوشنبه 15 فروردین 1390, 12:46 عصر
ساختار فايلي که deploy مي کني بايد بصورت زير باشه
app.ear
|-- app.war
|-- app.jar
|--lib
|--META-INF
و يکي از فايل هاي مهم در deploy فايل application.xml است که در META-INF ماژول اجرايي رو بهبش اضافه کن


<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"
version="5">

<display-name>app</display-name>

<module>
<web>
<web-uri>app.war</web-uri>
<context-root>/app</context-root>
</web>
</module>

<module>
<ejb>app.jar</ejb>
</module>



</application>

m44miri
دوشنبه 15 فروردین 1390, 13:27 عصر
در netbeans خودش این فایل را ایجاد نکرده..من باید خودم بصورت دستی ایجادش کنم؟

m44miri
دوشنبه 15 فروردین 1390, 13:30 عصر
منظور از <display-name>app</display-name>
و <context-root>/app</context-root>
چیه؟

omidbizdotcom
دوشنبه 15 فروردین 1390, 13:39 عصر
در netbeans خودش این فایل را ایجاد نکرده..من باید خودم بصورت دستی ایجادش کنم؟

براي اين ايجاد نکرده که اولش که داشتي پروژتو مي ساختي نگفتي اين پروژه enterprise



نظور از <display-name>app</display-name>
و <context-root>/app</context-root>

يعني localhost:8080/app از اين آدرس بعد از بالا اومدن کانتينر به برنامه دسترسي داري app يه اسم مي توني هر چيزي جاش بذاري
در ضمن مهم نيست با چي کار مي کني با notepad هم اگه اين ساختار و ايجاد کني پروژه اجرا مي شه وقتي داشتي پروژتو مي ساختي يه اشتباهي کردي

omidbizdotcom
دوشنبه 15 فروردین 1390, 13:41 عصر
يه نگاهي به اين بنداز


http://wiki.netbeans.org/CreatingEJB3UsingNetbeansAndGlassfish

javaphantom
دوشنبه 15 فروردین 1390, 15:59 عصر
ساختار فايلي که deploy مي کني بايد بصورت زير باشه
app.ear
|-- app.war
|-- app.jar
|--lib
|--META-INF
و يکي از فايل هاي مهم در deploy فايل application.xml است که در META-INF ماژول اجرايي رو بهبش اضافه کن


<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"
version="5">

<display-name>app</display-name>

<module>
<web>
<web-uri>app.war</web-uri>
<context-root>/app</context-root>
</web>
</module>

<module>
<ejb>app.jar</ejb>
</module>



</application>


application.xml اجباری نیست.

می تونی بصورت جداگانه ماژولهای war که مربوط به web و ماژولهای jar که مربوط به ejb هستم جداگانه deploy کنی.

m44miri
دوشنبه 15 فروردین 1390, 16:40 عصر
میشه یک لینک بر مبنای همون application.xml بهم بدی؟
روشی که توی این لینک آخری دادی روش stable ی نیست.یک دفعه کار میکنه ۵ دفعه کار نمیکنه.از طرفی هم توی این روشی که آموزش داده من چیزی بنام application.xml ندیدم.توی تمام شاخه های پروژه ای که ایجاد کردم اصلا همچین فایلی ندیدم.

m44miri
دوشنبه 15 فروردین 1390, 17:41 عصر
بیشتر وقتها شروع میکنه به دادن پیغام که بالا گفتم.
من سیستم عامل من لینوکسه...یک بار netbeans
را پاک کردم و دوباره نصب کردم اما فایده ای نداشت

m44miri
سه شنبه 16 فروردین 1390, 11:32 صبح
مشکل من حل شد.این فیلم تغریبا توضیحات خوبی داده :
http://www.youtube.com/watch?v=uI8TGqv-5hk
اما یک سوال دارم
توی این فیلم و خیلی از کتابا اینطوری گفته بنویسیم return (SessionBeanRemote) c.lookup("java:global/EJBModule/SessionBean!ejb.SessionBeanRemote");
اما من نتونستم با این فرمت جواب بگیرم و به ماژول متصل بشم
بجاش در سمت ejb اینو نوشتم : @Stateless(mappedName="SessionBeanRemote")
و بجای خط بالا اینو نوشتم : return (SessionBeanRemote) c.lookup("SessionBeanRemote");
بنظر شما با این فرمت نوشتن اصلا درست هست یا نه ؟

javaphantom
سه شنبه 16 فروردین 1390, 12:08 عصر
کل آدرسی که توی jvm برای session جنابعالی درست شده بود رو به یک نام نگاشت یا map کردی.

وقتی اون اسم رو می گی container به آدرسی که او Object رو برات درست کرده می ره و برات می یاردش.

خوبی این کار این هست که اگر یک interface داشته باشی حالا می خواد remote باشه یا local چند کلاس اون و implement کرده باشند می تونی او کلاسها رو با همین روش از هم متمایز کنی.

omidbizdotcom
سه شنبه 16 فروردین 1390, 13:45 عصر
من پيشنهاد مي کنم اگه واقعا از قدرت EJB مي خواي استفاده کني سراغ فريم ورک زير برو کار باهاشم خيلي راحته
http://seamframework.org (http://seamframework.org/)

m44miri
سه شنبه 16 فروردین 1390, 13:54 عصر
واقعا فکر میکنم یک مشکلی وجود داره در glassfish
موقع deploy وقتی از این کد استفاده میکنم پیغام خطا میده ولی وقتی حذفش میکنم درست میشه@Stateless(mappedName="SessionBeanRemote")
خیلی وقتی همون پیغام خطایی که میگه ماژول پیدا نشد را میده...حدس میزنید مشکل میتونه از چی باشه؟
نگفتید چرا وقتی mappedName="SessionBeanRemote" را حذف میکنم نمیتونه ماژول را پیدا کنه!!!

m44miri
سه شنبه 16 فروردین 1390, 14:33 عصر
من پيشنهاد مي کنم اگه واقعا از قدرت EJB مي خواي استفاده کني سراغ فريم ورک زير برو کار باهاشم خيلي راحته
http://seamframework.org (http://seamframework.org/)

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

javaphantom
سه شنبه 16 فروردین 1390, 14:34 عصر
glassfish مشکلی نداره. وقتی شما mappedName رو حذف می کنی موقع deploy بهت می گه به چه آدرسی داره نام گذاری می کنه. تا اونجا که یادم تو glassfish مستقیم آدرس صدا می کنی

یعنی اگر کلاس شما در com.babak.biz.MyClass باشه همینطوری lookup("com.babak.biz.MyClass");
رو بزنی lookup می کنه همین

m44miri
سه شنبه 16 فروردین 1390, 17:55 عصر
پس در glassfish استفاده از mappedName اشکالی نداره!! ولی چرا وقتی mappedName وجود داره دائما error پیدا نکردن ماژول را میده..
شما میدونی مشکل از چی میتونه باشه؟ شما خودتون از چه application server استفاده میکنید؟

javaphantom
سه شنبه 16 فروردین 1390, 21:15 عصر
پس در glassfish استفاده از mappedName اشکالی نداره!! ولی چرا وقتی mappedName وجود داره دائما error پیدا نکردن ماژول را میده..
شما میدونی مشکل از چی میتونه باشه؟ شما خودتون از چه application server استفاده میکنید؟

آخه این چه حرفی داری می زنی که اشکالی نداره. معلومه که نداره. مشکل شما اینکه هنوز مفهوم IOC، Container و از همه مهمتر JNDI رو متوجه نشدین.

وقتی کلاسی که بالاش تگ stateless می خوره داخل container ejb می اندازی یا به عبارت دیگر deploy می کنی به این معناست که داری به container می گی بابا life cycle این object دست تو یعنی خودت از این class object درست کن هر چندتا که باید بکنی خودت از بین ببر زمانی که باید از ببین ببری و هزار داستان دیگه. خوب حالا داستان JNDI چی هست. باید از این کلاسی که نمونه ازش ساخته می شه یک آدرسی درست بشه که شما از سمت کلاینت بتونی بهش دسترسی داشته باشی دیگه. مثل اینکه بگی c:\porogram files\java\bin\java.exe

یک آدرس داری می ری که به java.exe برسی.این داستان هم دقیقا برای اون object داره بوجود می یاد.

حالا می تونی یک shortcut برای آدرس بالا بوحود بیاری و اسمش رو بزار java و روی desktop بزاری. ولی نهایت اون آدرس بالا رو خودش میره. داستان mappedName هم همینه. مثل shortcut می مونه. بجایی اینکه کل آدرس رو بدی یک اسم بهش می دی او خودش آدرس رو می ره. ربطی به glassfish یا JBoss یا هر چیزه دیگه نداره. منتها در هر webapplication server آدرس دادن متفاوت مثل تفاوت windows با linux که تو windows برای جدا کردن فلودر از \ استفاده می شه در linux از /.

تو پست قبل بهت گفتم توی glassfish آدرس مستقیم رو نمی خواد بصورت
java:global/EJBModule/SessionBean!ejb.SessionBeanRemote
بدی کافی هست که از آدرس package کلاس تا خود کلاس رو بدی
یعنی اگر کلاس تو که @Statateless هست توی package ی مثل com.ejb.MyClass هست همین رو فقط بنویس یعنی
lookup("com.ejb.MyClass");

یا
lookup("com/ejb/MyClass");

omidbizdotcom
چهارشنبه 17 فروردین 1390, 10:13 صبح
من پيشنهاد مي کنم قبل از اينکه با هر تکنولوژي تو جاوا خواستي کار کني قبلش يکم مطالعه کن و نمونه ببين
به لينک پايين يه سر بزن و کامنت هاي پست هم يه نگاهي بکن


http://www.adam-bien.com/roller/abien/entry/ejb_3_portability_issue_why

بر اي کار با EJB Bean يه annotation هم وجود دارد


@EJB
IBean ejbBean