我无法设置 jndi.properties 来访问 Jboss 上的远程 EJB 5
I can't setup my jndi.properties to access remote EJBs on Jboss 5
我正在尝试设置 Jboss 服务器“客户端”(版本 5.1.0)以使用来自另一个 Jboss 服务器(10.90.0.91)的远程 EJB,但我做不到使用 Jboss 客户端上的 jndi.properties 文件执行此操作。
我可以在我的客户端上使用这个简单的代码获取远程 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
收件人:
# 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 查找设置设置为 [=43] 中的远程 EJB =] 5?如何在不将 jndi.properties 文件放入我的 WAR 文件的情况下将 jndi.properties 文件配置为在应用程序类路径中可用?
谢谢!
好吧,我找到了另一个解决方案。
我在 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);
}
有效 :).
另一种方法是在 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 中找到更多信息。
我正在尝试设置 Jboss 服务器“客户端”(版本 5.1.0)以使用来自另一个 Jboss 服务器(10.90.0.91)的远程 EJB,但我做不到使用 Jboss 客户端上的 jndi.properties 文件执行此操作。
我可以在我的客户端上使用这个简单的代码获取远程 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
收件人:
# 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 查找设置设置为 [=43] 中的远程 EJB =] 5?如何在不将 jndi.properties 文件放入我的 WAR 文件的情况下将 jndi.properties 文件配置为在应用程序类路径中可用?
谢谢!
好吧,我找到了另一个解决方案。
我在 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);
}
有效 :).
另一种方法是在 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 中找到更多信息。