2016-08-19 10 views
7

Я пытаюсь настроить «клиент» сервера Jboss (версия 5.1.0) для использования удаленных EJB с другого сервера Jboss (10.90.0.91) , но я не могу это сделать, используя файл jndi.properties на клиенте Jboss.Я не могу настроить свои jndi.properties для доступа к удаленным EJBs на Jboss 5

я могу получить удаленный EJB с помощью этого простого кода на моем клиенте:

 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); 
     } 

Это прекрасно работает.

Теперь я хотел бы настроить клиент Jboss с этими свойствами. Но если бы я изменить существующий файл jndi.properties локализованный на server/{application}/conf/ из:

# 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 

To:

# 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 

я получаю некоторые ошибки, когда я запускаю клиент JBoss (видимо, я не знаю, что Я делаю :)):

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) 
[...] 

И в финале:

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** 

Итак, я думаю, что не могу касаться уже существующих свойств JNDI в этом файле.

Если файл jndi.properties не может быть изменен, так как он используется самим JBoss, в каком месте ставит мои настройки поиска JNDI на удаленные EJB в Jboss 5? Как настроить файл jndi.properties, который будет доступен в пути к классам приложений, не помещать файл jndi.properties внутри моего WAR-файла?

Спасибо!

+1

Вы упомянули клиента jboss, но я думаю, что вы имеете в виду сервер jboss. Таким образом, вы хотите, чтобы server1 был клиентом server2, где server2 предоставляет EJB. Если это правда, я не думаю, что вы можете изменить jndi.properties, поскольку это для конфигурации server1. В рамках вашей войны, запущенной на сервере 1, вам понадобится нечто похожее на образец клиентского кода. Эти свойства в вашем примере клиентского кода могут быть в собственном файле конфигурации. –

+1

Привет! Да, это «клиент» сервера jboss. В некоторых документах о Jboss сказано, что конфигурация этих свойств возможна в jndi.properties 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

Оба сервера работают под управлением JBoss AS 5.x? –

ответ

2

Ну, я нашел другое решение.

Я создал новый файл с именем jndi-remote.properties в каталоге конфигурации от Jboss:

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

И я получить доступ к файлу в директории конфигурации JBoss (System.getProperty("jboss.server.config.url")) из 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 
} 

и инициализирует мои InitialContext:

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

Работы:.

3

Альтернативный способ сделать это настроить org.jboss.naming.ExternalContext MBean в файле 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> 

Ваш Java-код для выполнения поиска становится:

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

You может даже перемещаться по удаленному дереву JNDI с помощью JNDIView в локальной консоли управления при настройке.

Более подробную информацию можно найти в org.jboss.naming.ExternalContext MBean.