我无法设置我的jndi.properties来访问Jboss 5上的远程EJB

时间:2016-08-19 14:39:57

标签: java jboss ejb ejb-3.0 jboss5.x

我正在尝试设置Jboss服务器“client”(版本5.1.0)以使用来自另一个Jboss服务器(10.90.0.91)的远程EJB,但我不能使用jndi.properties文件来执行此操作Jboss客户端。

我可以在客户端使用这个简单的代码获取远程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客户端。但是如果我编辑server/{application}/conf/上存在的jndi.properties文件来自:

# 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 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查找设置放到Jboss 5中的远程EJB中?如何在应用程序类路径中配置jndi.properties文件,而不将jndi.properties文件放在WAR文件中?

谢谢!

2 个答案:

答案 0 :(得分:3)

另一种方法是在jboss-service.xml文件中配置org.jboss.naming.ExternalContext MBean:

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

在设置时,您甚至可以使用本地管理控制台中的JNDIView导航远程JNDI树。

更多信息可在org.jboss.naming.ExternalContext MBean中找到。

答案 1 :(得分:2)

好吧,我找到了另一个解决方案。

我在Jboss的配置目录中创建了一个名为 jndi-remote.properties 的新文件:

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

我从Java访问Jboss配置目录(System.getProperty("jboss.server.config.url"))中的文件:

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

工作:)。