2016-08-19 49 views
7

Próbuję konfiguracji serwera JBoss „klient” (wersja 5.1.0), aby korzystać z funkcji zdalnego EJBs z innego serwera JBoss (10.90.0.91) , ale nie mogę tego zrobić, używając pliku jndi.properties na kliencie Jboss.nie mogę skonfigurować moje jndi.properties na zdalny dostęp EJBs na JBoss 5

można uzyskać zdalny EJB za pomocą tego prostego kodu na mojego klienta:

 InitialContext ctx = null; 
     try { 
      Hashtable<String, String> jndiProps = new Hashtable<String, String>(); 
      jndiProps.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); 
      jndiProps.put(InitialContext.PROVIDER_URL, "jnp://10.90.0.91:1099"); 
      ctx = new InitialContext(jndiProps); 
      return ctx.lookup(jndiName); 
     } catch (NamingException e) { 
      throw new RuntimeException(e); 
     } 

To działa prawidłowo.

Teraz chciałbym, aby skonfigurować klienta JBoss Dzięki tej właściwości. Ale jeśli mogę edytować istniejący plik jndi.properties zlokalizowaną na server/{application}/conf/ od:

# DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING 
# 
java.naming.factory.initial=org.jboss.iiop.naming.ORBInitialContextFactory 
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces 

Do:

# DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOU ARE DOING 
# 
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
java.naming.provider.url=jnp://10.90.0.91:1099 

otrzymam jakieś błędy podczas uruchamiania klienta JBoss (podobno, nie wiem co robię :)):

2016-08-19 10:17:41,645 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=HASessionStateService state=Create 
javax.naming.NameAlreadyBoundException: Default 
    at org.jnp.server.NamingServer.bind(NamingServer.java:209) 
    at org.jnp.server.NamingServer.bind(NamingServer.java:167) 
[...] 

2016-08-19 10:17:42,767 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=ProfileServiceProxyFactory state=Create 
javax.naming.NameAlreadyBoundException: ProfileService 
    at org.jnp.server.NamingServer.bind(NamingServer.java:209) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
[...] 

2016-08-19 10:17:44,778 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=jboss:service=ClientUserTransaction state=Create mode=Manual requiredState=Installed 
javax.naming.NameAlreadyBoundException: UserTransaction 
    at org.jnp.server.NamingServer.bind(NamingServer.java:209) 
    at sun.reflect.GeneratedMethodAccessor487.invoke(Unknown Source) 
[...] 

A w finale:

2016-08-19 10:17:51,993 ERROR [org.jboss.system.server.profileservice.ProfileServiceBootstrap] (main) Failed to load profile: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS): 

DEPLOYMENTS MISSING DEPENDENCIES: 
    Deployment "ProfileServiceInvocationHandler" is missing the following dependencies: 
    Dependency "ProfileServiceProxyFactory" (should be in state "Configured", but is actually in state "**ERROR**") 
    Dependency "ProfileServiceProxyFactory" (should be in state "Configured", but is actually in state "**ERROR**") 

DEPLOYMENTS IN ERROR: 
    Deployment "jboss:service=ClientUserTransaction" is in error due to the following reason(s): javax.naming.NameAlreadyBoundException: UserTransaction 
    Deployment "HASessionStateService" is in error due to the following reason(s): javax.naming.NameAlreadyBoundException: Default 
    Deployment "ProfileServiceProxyFactory" is in error due to the following reason(s): javax.naming.NameAlreadyBoundException: ProfileService, **ERROR** 

Sądzę, że nie mogę dotknąć już istniejących właściwości JNDI w tym pliku.

Jeśli nie można zmienić pliku jndi.properties, ponieważ jest on używany przez samą aplikację JBoss, w której lokalizacji umieszcza moje ustawienia wyszukiwania JNDI w zdalnych komponentach EJB w ramach Jboss 5? Jak mogę skonfigurować plik jndi.properties, aby był dostępny w ścieżce klasy aplikacji bez umieszczania pliku jndi.properties w pliku WAR?

Dzięki!

+1

Wspomniałeś klienta jboss, ale myślę, że masz na myśli serwer jboss. Więc chcesz, aby serwer1 był klientem serwera2, gdzie serwer2 udostępnia komponenty EJB. Jeśli to prawda, nie sądzę, że można zmienić plik jndi.properties, ponieważ dotyczy to konfiguracji serwera1. Podczas twojej wojny uruchomionej na serwerze1 potrzebujesz czegoś podobnego do przykładowego kodu klienta. Te właściwości w przykładowym kodzie klienta mogą znajdować się w jego własnym pliku konfiguracyjnym. –

+1

Cześć! Tak, to "klient" serwera jboss. Niektóre dokumenty na temat Jbossa mówiły, że konfiguracja tych właściwości jest możliwa w jndi.properties w Jboss: https://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Contexts-Obtaining_a_Context_using_InitialContext.html#Obtaining_a_Context_using_InitialContext- A_sample_jndi.properties_file – Dherik

+0

Czy oba serwery działają w JBoss AS 5.x? –

Odpowiedz

2

Cóż, znalazłem inne rozwiązanie.

stworzyłem nowy plik o nazwie jndi-remote.properties w katalogu konfiguracyjnej Jboss:

{jboss_home}/server/default/conf/jndi-remote.properties 

I dostęp do pliku w katalogu konfiguracyjnym JBoss (System.getProperty("jboss.server.config.url")) z Java:

String fileName = System.getProperty("jboss.server.config.url") + "/" + "jndi-remote.properties"; 

Properties properties = null; 
try { 
    URL url = new URL(fileName); 
    if(new File(url.toURI()).exists()) { 
     properties = new Properties(); 
     properties.load(url.openStream()); 
     LOGGER.info("The file " + "jndi-remote.properties" + " was loaded from " + fileName); 
    } 
} catch (MalformedURLException e) { 
    //throw 
} catch (URISyntaxException e) { 
    //throw 
} catch (IOException e) { 
    //throw 
} 

i zainicjować moje InitialContext:

if (properties != null) { 
    ctx = new InitialContext(properties); 
} 

Działa :).

3

Alternatywnym sposobem, aby to zrobić, aby skonfigurować org.jboss.naming.ExternalContext MBean w pliku jboss-service.xml:

<mbean code="org.jboss.naming.ExternalContext" 
     name="jboss.jndi:service=ExternalContext,jndiName=external/server2"> 
    <attribute name="JndiName">external/server2</attribute> 
    <attribute name="Properties"> 
     java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory 
     java.naming.provider.url=jnp://10.90.0.91:1099 
     <!-- other properties as needed --> 
    </attribute> 
    <attribute name="InitialContext"> javax.naming.IntialContext </attribute> 
    <attribute name="RemoteAccess">false</attribute> 
</mbean> 

Twój kod Java, aby wykonać wyszukiwanie staje się wówczas:

Context initialContext = new InitialContext(); 
return initialContext.lookup("external/server2/" + jndiName); 

You może nawet poruszać się po zdalnym drzewie JNDI przy użyciu JNDIView w lokalnej konsoli zarządzania po ustawieniu tej opcji.

Więcej informacji można znaleźć w org.jboss.naming.ExternalContext MBean.