WebHU - Programozási kérdések és válaszok

JNDI keresés a JBoss AS 6.0-n

Van egy alkalmazásom a localhostnál a JBoss 6.0 AS rendszeren. Ennek az alkalmazásnak van egy távoli EJB komponense, az példaEJB. Most megpróbálok kódolni egy egyszerű kliens alkalmazást, amely az ExampleEJB-t használja. Ez az ügyfélalkalmazás egyetlen alkalmazáskiszolgálón sem lesz telepítve. Az ötlet egy egyszerű Java SE kliensprogram kódolása. A következőt írtam a kereséshez:

Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,"localhost:1099");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

InitialContext ic = new InitialContext(env);

Ezen a ponton két megközelítést próbáltam ki. Az első az volt, hogy közvetlen keresést végeztem, amint azt a Java EE 6 Tutorial példája is mutatja (http://docs.oracle.com/javaee/6/tutorial/doc/gipjf.html):

ExampleEJB exampleEJB = (ExampleEJB) ic.lookup("java:global/myApp/ExampleEJB");

A második kísérlet az volt, hogy megpróbáljuk megszerezni a JNDI környezeti környezetet, majd megszerezni a kívánt babot ebből a környezetből:

Context envContext  = (Context)ic.lookup("java:/comp/env");
envContext.lookup(...)

A probléma az, hogy a következő kivételeket kapom: "javax.naming.NameNotFoundException: global not bound" és "javax.naming.NameNotFoundException: comp not bound". Nem tudom a kívánt módon végrehajtani a keresést.

Van valakinek tippje?

24.08.2013

Válaszok:


1

Ha java:global/-t használ, akkor a JNDI névnek így kell kinéznie:

java:global/<application>/<module>/<component>

or

java:global/<ear>/<ejb-jar>/<ejb-name>

ahol az ear az .ear fájl neve, az ejb-jar pedig az EJB .jar fájl neve.


Ha helyi és távoli interfésszel is rendelkezik, az alábbi sémával eltérhet:

java:global/<ear>/<ejb-jar>/<ejb-name>!<interface>

ahol az interfész tartalmazza a csomagot és az interfész nevét (példa: a.b.c.ExampleEJBRemoteIfc).


Tehát a beállításban: Ha a myApp.ear olyan myEjb.jar-et tartalmaz, amely egy EJB-t tartalmaz, amelynek neve ExampleEJB, akkor próbálja meg ezt a JNDI nevet:

java:global/myApp/myEjb/ExampleEJB

or

java:global/myApp/myEjb/ExampleEJB!a.b.c.ExampleEJBRemoteIfc

Mindenesetre ellenőrizze még egyszer a JNDI-nev(ek)et a JMX konzolon:

http://localhost:8080/jmx-console/
  1. Kattintson a Service=JNDIView lehetőségre
  2. Műveletek lista: Kattintson a meghívás gombra
  3. Keressen ezen az oldalon az EJB név alapján

A comp/env és a globális között: Mi a kapcsolat a java között: comp/env és java:global

24.08.2013
  • Helló, berillium. Köszönöm a válaszod. Megnéztem a JNDIView-t a jmx-console-nál. Erről nem tudtam, amikor a kérdést írtam. Amikor végrehajtottam a keresést a következő helyen: ExampleEar/ExampleEJBImpl/remote, minden rendben működött. Meg tudná erősíteni, hogy a JBoss az EJB-t a java:global előtag nélküli helyekhez köti? Tudod miért? Azt hittem, hogy ez a Java EE 6 specifikációja, így minden alkalmazásszerver tiszteletben tartja az alapértelmezett java:global/‹application›/‹module›/‹komponens› helyet. 25.08.2013
  • A név különböző névterekhez van kötve (különböző hatókörrel). Ezért kezdtem a választ azzal, hogy ha java:global ...-t használsz. Tehát igen, vannak más helyek is, amelyek különböző sémákkal rendelkeznek. Az Ön által választott név is működik. Mit mutat a JNDIView a java névtérben? Az én esetemben a java:global bejegyzés csak egy hivatkozás a JNDI-ben az Ön által használt bejegyzéshez. Tehát mindkettőnek működnie kell. 25.08.2013
  • Igen, igazad van. Látom a PéldaEJBImpl-emet is java: névtéren, ahogy mondtad. Globális és Java névtereken egyaránt megtalálható. Azonban nem tudok hozzáférni a java névterhez az ügyfélalkalmazásomból. Még akkor is, ha a JNDIView által megadott helyes utat használom. A probléma nyilvánvalóan akkor jelentkezik, amikor egy másik JVM-folyamatból próbálom végrehajtani a keresést. A Java névtér csak ugyanarról a JVM-ről érhető el. Az én esetemben a globális névteret kell használnom a kereséshez. igaz? Köszönöm mégegyszer. 25.08.2013

  • 2

    Oké, megoldottam a problémámat. Felfedeztem, hogy lehetséges a JNDI fa megjelenítése a JBosson a JBoss JMX Management Console elérésével (alapértelmezett hely: localhost: 8080/jmx-console/). Keresse meg a JNDIView szolgáltatást, és hívja meg a lista módszerét. A JNDI fa vizualizálásával rájöttem, hogy rossz helyet keresek. JBoss regisztrálta az EJB-met a következő címen:

    +- ExampleEar (class: org.jnp.interfaces.NamingContext)
      |   +- ExampleEJBImpl (class: org.jnp.interfaces.NamingContext)
      |   |   +- remote-br.exemplo.ejb.ExampleEJB (class: Proxy for: br.example.ejb.ExampleEJB)
      |   |   +- remote (class: Proxy for: br.example.ejb.ExampleEJB)
    

    Most módosítottam a kódomat, hogy a következő helyen végezzem a keresést:

    ExampleEJB exampleEJB = (ExampleEJB) ic.lookup("ExampleEar/ExampleEJBImpl/remote");
    

    és minden rendben ment.

    24.08.2013
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..