argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Някои правил нещо с EJB 3.0 ? нужна ми е помощ  (Прочетена 5471 пъти)

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

ако някои е правил нещо с EJB 3.0 .. да хелпне
че закъсах
иначе пробвам на Jboss качил сам всичко както трябва от инсталър с EJB3 enabled обаче ми се струва че не се делпоиват EJB-тата..
deployвам през JDeveloper той какво прави просто EAR file с 2та класа и ги копира в jboss\server\default\deploy vsi4ko normalno osven kogato trygna da vzimam EJB-to zashtoto go nqmaaa ;)
javax.naming.NameNotFoundException: beans.SimpleSession not bound
   at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)

Test client :
    public static void main(String[] args) {
        InitialContext ctx;
        try {

            ctx = new InitialContext();
            ctx.addToEnvironment("java.naming.factory.initial",
                                 "org.jnp.interfaces.NamingContextFactory");
            ctx.addToEnvironment("java.naming.factory.url.pkgs",
                                 "org.jboss.naming:org.jnp.interfaces");
            ctx.addToEnvironment(Context.PROVIDER_URL, "jnp://localhost:1099");
            SimpleSession simpleSession =
                (SimpleSession)ctx.lookup(SimpleSession.class.getName());
            System.out.println(simpleSession.sayHello("EJB3"));
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
Активен

VooDooMaN

  • Гост

Не съм работил с EJB3, а само с 2.1,  и правя само предположение - не трябвя ли да правиш lookup по jndi name и после да претипизираш към ejb интерфейса?
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org

Я си пусни JMX конзолата и погледни вижда ли ти се там EJB-то в JNDI дървото.

Поздрави,

Николай Манчев
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

da eto kato Invoke-na listXML()
4.0.3 EJB 3 deploy
org.jnp.interfaces.NamingContext

SimpleSession
org.jnp.interfaces.NamingContext

remote
$Proxy65

ama test clienta si znae negovoto
probvah i s ime SimpleSession/remote - rezultata e the same.
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

eto vsichko:
mport javax.ejb.Stateless;

@Stateless(name="SimpleSession")
public class SimpleSessionBean implements SimpleSession {
public SimpleSessionBean() {
}

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

package beans;

import javax.ejb.Remote;

@Remote
public interface SimpleSession {
public String sayHello(String name) ;
}


testoviq client go ima gore no vse pak :

package client;

import beans.SimpleSession;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class SimpleSessionClient {
public static void main(String[] args) {
InitialContext ctx;
try {


ctx = new InitialContext();
ctx.addToEnvironment("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
ctx.addToEnvironment("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
ctx.addToEnvironment(Context.PROVIDER_URL,"jnp://localhost:1099");
SimpleSession simpleSession
= (SimpleSession) ctx.lookup(SimpleSession.class.getName());
System.out.println(simpleSession.sayHello("EJB3"));
} catch (NamingException e) {
e.printStackTrace();
}
}
}


jar tf ear fail
META-INF/application.xml
SimpleSessionBean.jar
jar tf jar fail
beans/SimpleSession.class
beans/SimpleSessionBean.class

kogato deployvam v loga na JBOSS vijdam :
23:28:12,296 INFO [EARDeployer] Undeploying J2EE application, destroy step: fil
e:/G:/jboss-4.0.4.GA/server/default/deploy/SimpleSessionBean.ear
23:28:12,296 INFO [EARDeployer] Undeployed J2EE application: file:/G:/jboss-4.0
.4.GA/server/default/deploy/SimpleSessionBean.ear
23:28:12,296 INFO [EARDeployer] Init J2EE application: file:/G:/jboss-4.0.4.GA/
server/default/deploy/SimpleSessionBean.ear
23:28:12,375 INFO [Ejb3Deployment] EJB3 deployment time took: 16
23:28:12,390 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:ear=Simpl
eSessionBean.ear,jar=SimpleSessionBean.jar,name=SimpleSession,service=EJB3 with
dependencies:
23:28:12,406 INFO [EJBContainer] STARTED EJB: beans.SimpleSessionBean ejbName:
SimpleSession
23:28:12,421 INFO [EJB3Deployer] Deployed: file:/G:/jboss-4.0.4.GA/server/defau
lt/tmp/deploy/tmp25139SimpleSessionBean.ear-contents/SimpleSessionBean.jar
23:28:12,421 INFO [EARDeployer] Started J2EE application: file:/G:/jboss-4.0.4.
GA/server/default/deploy/SimpleSessionBean.ear
neshto stranno obahce
v JMX console-ta vijdam
SimpleSessionBean
no v jboss.j2ee apps
veroqtno tova e MBean za saotvetnoto EJB de ama vse pak
eto paste
jboss.j2ee
ear=SimpleSessionBean.ear,jar=SimpleSessionBean.jar,name=SimpleSession,service=EJB3
module=SimpleSessionBean.jar,service=EJB3

application.xml-a koito e generiran ot Jdeveloper sydyrja :
<?xml version = '1.0' encoding = 'windows-1251'?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee">
<display-name>SimpleSessionBean</display-name>

SimpleSessionBean.jar
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

Не съм работил с EJB3, а само с 2.1,  и правя само предположение - не трябвя ли да правиш lookup по jndi name и после да претипизираш към ejb интерфейса?
ami ne dokolkoto razbrah ne e nujno da minavam prez  PortableRemoteObject.narrow moga napravo da castna do Remote Interfeisa zashtoto vse pak tuka nqma Home interfeis i nqma na kakvo da vikame create()
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org

Абе я го lookup-ни като ползваш string варианта на метода. Т.е. кажи му само "SimpleSession" вместо class.getName() и т.н.

Поздрави,

Николай
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

SimpleSession пробвах го и така пак същото
пробвах и s bean.SimpleSession защото taka e paketa pak sashtoto
probah i s java env otpred .. togava pyk garmi che nemojel da nameri bound "comp"
nqmam ideq bati omagiosaniq absurden kryg..
a ve q pogledni applicaiton.xml taka li trqbva dae ? men tva mi izglejda kato nqkav super stranen  J2EE application xml.
Активен

Phyz

  • Неактивен Неактивен
  • Публикации: 45

Що не видиш какво има въобще bind нато в тоя твоя контекст. Пробвай примерно с:

        Context ctx = new InitialContext();
        ctx.addToEnvironment("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        ctx.addToEnvironment("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
        ctx.addToEnvironment(Context.PROVIDER_URL,"jnp://localhost:1099");
        NamingEnumeration it = ctx.list("");
        Object obj;
       
        while (it.hasMoreElements()) {
            obj = it.nextElement();
            System.out.println(obj);
        }

Ако има подконтексти - типовете са им org.jnp.interfaces.NamingContext. Може и тях да сканираш рекурсивно докато си намериш бийна... или не го намериш въобще :)
Активен
Quidquid latine dictum sit, altum sonatur.
Whatever is said in Latin sounds profound.

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

znachi izhoda ot tova e :
XAConnectionFactory: org.jboss.mq.SpyXAConnectionFactory
TopicConnectionFactory: org.jboss.naming.LinkRefPair
EventDispatcher: org.jboss.ws.eventing.mgmt.DispatcherDelegate
UserTransactionSessionFactory: $Proxy42
UIL2ConnectionFactory: javax.naming.LinkRef
UIL2XAConnectionFactory: javax.naming.LinkRef
QueueConnectionFactory: org.jboss.naming.LinkRefPair
topic: org.jnp.interfaces.NamingContext
queue: org.jnp.interfaces.NamingContext
SimpleSessionBean: org.jnp.interfaces.NamingContext
ConnectionFactory: org.jboss.mq.SpyConnectionFactory
UserTransaction: org.jboss.tm.usertx.client.ClientUserTransaction
jmx: org.jnp.interfaces.NamingContext
UILXAConnectionFactory: javax.naming.LinkRef
UILConnectionFactory: javax.naming.LinkRef
Process exited with exit code 0.

t.e. SimpleSessionBean si e tam stranno zashto e narechen SimpleSessionBean a ne SimpleSession KAKTO E V VSICHKI TUTORIALS kakto i da e.
sega probvah da napisha sledniq client

        InitialContext ctx;
        try {

            ctx = new InitialContext();
            ctx.addToEnvironment("java.naming.factory.initial",
                                 "org.jnp.interfaces.NamingContextFactory");
            ctx.addToEnvironment("java.naming.factory.url.pkgs",
                                 "org.jboss.naming:org.jnp.interfaces");
            ctx.addToEnvironment(Context.PROVIDER_URL, "jnp://localhost:1099");
            SimpleSession simpleSession =
                (SimpleSession)ctx.lookup("SimpleSessionBean");
            System.out.println(simpleSession.sayHello("EJB3"));

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

razlikata e che tyrsq SimpleSessionBean a ne SimpleSession ili SimpleSession/remote btw s poslednoto dava che nemoje da nameri boudnnat "remote" !?!?!?! :) ludnica.
ta izhoda e
Exception in thread main
java.lang.ClassCastException: org.jnp.interfaces.NamingContext
   at client.SimpleSessionClient.main(SimpleSessionClient.java:39)
Process exited with exit code 1.
i poznaite koi e red 39
            SimpleSession simpleSession =
                (SimpleSession)ctx.lookup("SimpleSessionBean");
otnovo pastevam edin drug red vsichki znaqt koi
"public class SimpleSessionBean implements SimpleSession {"
E KVA E TAZI BOZA NEZNAM chesno basi magiite
pak polzvam
@Stateless(name="SimpleSession")
public class SimpleSessionBean implements SimpleSession {
tova e EJB-to
i interfeisa e
@Remote
public interface SimpleSession {

eto pak JNDIView list-a
 +- SimpleSessionBean (class: org.jnp.interfaces.NamingContext)
  |   +- SimpleSession (class: org.jnp.interfaces.NamingContext)
  |   |   +- remote (proxy: $Proxy58 implements interface beans.SimpleSession,interface org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBObject)
hora vie ste posledna nadejda chesto daite ideq.
« Последна редакция: 11.07.2006, 22:23:28 от JOKe »
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

Phyz
tiq imena deto vadi tva koeto mi dade sa imenata na Deploymen profiles :)
primer
JBoss Deploy (class: org.jnp.interfaces.NamingContext)
  |   +- Pisnami (class: org.jnp.interfaces.NamingContext)
  |   |   +- localStatefulProxyFactory (class: org.jboss.ejb3.stateful.StatefulLocalProxyFactory)
  |   |   +- local (class: java.lang.Object)
  |   |   +- remote (class: java.lang.Object)
  |   |   +- remoteStatefulProxyFactory (proxy: $Proxy77 implements interface org.jboss.ejb3.ProxyFactory)

nenzam shto taka stava

onzi tvoq primer vadi
JBoss Deploy: org.jnp.interfaces.NamingContext

i e normalno da gyrmi s ClassCastException
iavno
ctx.lookup(lookUpva za Enterprise Application name ) a ne za EJb-to koeto se namira v neq..
« Последна редакция: 11.07.2006, 22:45:35 от JOKe »
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

eto deploynah edno i sashto EJB v 2 EJB archive-a
JBoss Deploy (class: org.jnp.interfaces.NamingContext)
  |   +- Pisnami (class: org.jnp.interfaces.NamingContext)
  |   |   +- localStatefulProxyFactory (class: org.jboss.ejb3.stateful.StatefulLocalProxyFactory)
  |   |   +- local (class: java.lang.Object)
  |   |   +- remote (class: java.lang.Object)
  |   |   +- remoteStatefulProxyFactory (proxy: $Proxy77 implements interface org.jboss.ejb3.ProxyFactory)
pisnami (class: org.jnp.interfaces.NamingContext)
  |   +- Pisnami (class: org.jnp.interfaces.NamingContext)
  |   |   +- localStatefulProxyFactory (class: org.jboss.ejb3.stateful.StatefulLocalProxyFactory)
  |   |   +- local (class: java.lang.Object)
  |   |   +- remote (class: java.lang.Object)
  |   |   +- remoteStatefulProxyFactory (proxy: $Proxy77 implements interface org.jboss.ejb3.ProxyFactory)

i e normalno da ne moje da vzeme Pisnami shtoto go ima i v JBOSS delpoy i v pisnami .. taka che ... ? kak mojem da kajem che tyrsq tochno ejb .. ili kak moga da kaja jndiName-a s nqkva anotaciq pri delpoy na EJb-to ili znam li :>

namerih nqkva boza
@RemoteBinding(jndiBinding="testPisnami")
obahce neshto ne raboti mai mai :>
posle v JNDIView-to ne vijdam takova ime kakto i mi kazva che nqma boundnato takova
inache tova se namira v
import org.jboss.annotation.ejb.RemoteBinding;
i e nqkav fuckign class na JBoss
info :
http://docs.jboss.org/ejb3/app-server/reference/build/reference/en/html_single/index.html
a ma ne varshi rabota taka che kakto i da e.
« Последна редакция: 11.07.2006, 23:21:20 от JOKe »
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

OLEEEEE
proraboti
ta eto otgovora
Kato vseki Windows User az ne namerih Reshenie na problema a Zaobikolih problema.
a imenno
razkarah typiq JAR ot typiq EAR
deploynah samo Jar-a
posle vzeh reference s "HomeInterfaceName/remote"
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org

Браво!

Като следваща стъпка след намирането на решението ти предлагам да оставиш JBoss-а и да си намериш свестен Application Server  :wink:
« Последна редакция: 12.07.2006, 08:16:20 от Nikolay Manchev »
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

хахахаха да :) бтв .. ето това че jar в Ear прави проблем говори много лошо за Jboss
Активен

Phyz

  • Неактивен Неактивен
  • Публикации: 45

znachi izhoda ot tova e :
XAConnectionFactory: org.jboss.mq.SpyXAConnectionFactory
TopicConnectionFactory: org.jboss.naming.LinkRefPair
EventDispatcher: org.jboss.ws.eventing.mgmt.DispatcherDelegate
UserTransactionSessionFactory: $Proxy42
UIL2ConnectionFactory: javax.naming.LinkRef
UIL2XAConnectionFactory: javax.naming.LinkRef
QueueConnectionFactory: org.jboss.naming.LinkRefPair
topic: org.jnp.interfaces.NamingContext
queue: org.jnp.interfaces.NamingContext
SimpleSessionBean: org.jnp.interfaces.NamingContext
ConnectionFactory: org.jboss.mq.SpyConnectionFactory
UserTransaction: org.jboss.tm.usertx.client.ClientUserTransaction
jmx: org.jnp.interfaces.NamingContext
UILXAConnectionFactory: javax.naming.LinkRef
UILConnectionFactory: javax.naming.LinkRef
Process exited with exit code 0.

Казах ти че подконтекстовете са ти от тип org.jnp.interfaces.NamingContext. JNDI е като фаилова система - с поддиректории. В случая SimpleSessionBean ти е поддиректория. Трябваше да се сетиш да и поискаш списъка с нещо като ctx.list("SimpleSessionBean"). Вътре най-вероятно е имало нещо като "remote : nekyf.smahnat.Class"  и това ти е проксито към remote ния ти интерфейс. Един вид трябва да го lookup неш с "SimpleSessionBean/remote". само "SimpleSessionBean" ти връща поддконтекста (поддиректорията) и много ясно че ще гръмне с CCE.

Като следваща стъпка след намирането на решението ти предлагам да оставиш JBoss-а и да си намериш свестен Application Server  :wink:

Това ми звучи горе долу като "Като следваща стъпка ти предлагам да оставиш програмирането и да се зафанеш с нещо доста по-смислено..."
Активен
Quidquid latine dictum sit, altum sonatur.
Whatever is said in Latin sounds profound.

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

xaxaxa za men nqma smisleni neshta ;)
ok mersi vajnoto e ceh raboti
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

oki kato minavam prez EAR.
          InitialContext ctx;
          try {

              ctx = new InitialContext();
              ctx.addToEnvironment("java.naming.factory.initial",
                                   "org.jnp.interfaces.NamingContextFactory");
              ctx.addToEnvironment("java.naming.factory.url.pkgs",
                                   "org.jboss.naming:org.jnp.interfaces");
              ctx.addToEnvironment(Context.PROVIDER_URL, "jnp://localhost:1099");
              NamingContext ne=(NamingContext)ctx.lookup("StatefullEARFile");
             NamingEnumeration it= ne.list("");
            Object obj;
                   
                    while (it.hasMoreElements()) {
                        obj = it.nextElement();
                        System.out.println(obj);
                    }
           
          } catch (NamingException e) {
              e.printStackTrace();
          }

eto tova... znachi vzimam NamingContext-a narechen StatefullEARFile i go listvam
i to vadi
SimpleSession : org.jnp.interfaces.NamingContext
tva hubavo ama posle ako mu kaja

ako mu kaja
  NamingEnumeration it= ne.list("SimpleSession");
to vadi :
remote: java.lang.Object
remoteStatefulProxyFactory: $Proxy72
i znachi reshavam da vzema az s lookup(SimpleSession/remote") i gyrmi s
Exception in thread main
java.lang.ClassCastException: javax.naming.Reference
   at client.TestClient.main(TestClient.java:25)

 kadeto go kastvam do SimpleSession ( koeto mi e remote interfeisa ) .
kvo pak obyrkah :)

code :
          InitialContext ctx;
          try {

              ctx = new InitialContext();
              ctx.addToEnvironment("java.naming.factory.initial",
                                   "org.jnp.interfaces.NamingContextFactory");
              ctx.addToEnvironment("java.naming.factory.url.pkgs",
                                   "org.jboss.naming:org.jnp.interfaces");
              ctx.addToEnvironment(Context.PROVIDER_URL, "jnp://localhost:1099");
              NamingContext ne=(NamingContext)ctx.lookup("StatefullEARFile");
             SimpleSession ses=(SimpleSession) ne.lookup("SimpleSession/remote");
« Последна редакция: 12.07.2006, 13:51:55 от JOKe »
Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

eto kak go izpraskah
slojih mu jndiName na nqkav remoteBinding
tva e nqkva smahnata anotaciq samo za JBOSS
@Stateful(name = "SimpleSession")
@org.jboss.annotation.ejb.RemoteBinding(jndiBinding = "LUDNICA")

i posle si go vadi ot 1vo nivo na JNDIView-to i go vzimam s
SimpleSession xax = (SimpleSession) ctx.lookup("LUDNICA");
Активен

Atanas Todorov

  • Неактивен Неактивен
  • Публикации: 9

Малко късно забелязвам темата, но като гледам вече си намерил начина, по който става. Преди няколко месеца от JBoss въведоха тези анотации (@LocalBinding и @RemoteBinding) и промениха имената, с които се байндват интерфейсите на EJB-тата.

Преди това се байндваха FQN на интерфейсите, но решиха да го направят така, че lookup-името да включва и името на EAR-а - предполагам с цел да се предотвратят проблеми с дублиращи се имена на бийн-интерфейсите, диплойнати в различни EAR-и (а това не е редно да създава проблеми, имайки предвид, че тези приложения могат да са си съвсем независими /така да се каже поне от гледна точка на клас лоудерите/). Иначе така наистина малко се поусложнява кода, но явно са решили, че си струва да се направи тази жертва.

Та така или иначе промяната (за добро или лошо) е факт. Очевидно не е хубаво да се хардкод-ват имената на EAR-ите, ето защо е най-добре да се ползват тези анотации. А те са си чисто "JBoss-овски", поради простата причина, че EJB спецификацията не казва нищо (или почти нищо) по въпроса свързан с JNDI lookup имената и почти всички въпроси свързани с class loaders, видимост на класове и прочие...

Колкото до PortableRemoteObject.narrow(...), той се ползваше не само при remote home, но и при remote component интерфейсите, ама това е друга тема, свързана с IIOP съвместимост между различните контейнери и няма общо с името за lookup-ване.

Поздрави,
Наско

Активен