Properties env = new Properties();
env.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.jboss.naming.HttpNamingContextFactory");
env.setProperty(Context.URL_PKG_PREFIXES,
"org.jboss.naming:org.jnp.interfaces");
env
.setProperty(Context.PROVIDER_URL,
"http://172.20.88.208:8080/invoker/JNDIFactory/?return-exception=true");
Context ctx = new InitialContext(env);
System.out.println("Created InitialContext, env=" + env);
RMIAdaptor data = (RMIAdaptor) ctx.lookup("jmx/invoker/RMIAdaptor");
System.out.println("lookup(jmx/invoker/RMIAdaptor): " + data);
报错如下javax.naming.CommunicationException: Operation failed [Root exception is java.rmi.ServerException: IOE; nested exception is: 
java.net.UnknownHostException: linux-208]
at org.jboss.naming.interceptors.ExceptionInterceptor.invoke(ExceptionInterceptor.java:50)
at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:55)
at org.jboss.proxy.ClientMethodInterceptor.invoke(ClientMethodInterceptor.java:59)
at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:86)
at $Proxy0.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at jmx.JBossRMIOverHttp.httpOverRmi(JBossRMIOverHttp.java:22)
at jmx.JBossRMIOverHttp.main(JBossRMIOverHttp.java:28)
Caused by: java.rmi.ServerException: IOE; nested exception is: 
java.net.UnknownHostException: linux-208
at org.jboss.invocation.http.interfaces.HttpInvokerProxy.invoke(HttpInvokerProxy.java:118)
at org.jboss.invocation.InvokerInterceptor.invokeInvoker(InvokerInterceptor.java:227)
at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:167)
at org.jboss.naming.interceptors.ExceptionInterceptor.invoke(ExceptionInterceptor.java:42)
... 9 more
Caused by: java.net.UnknownHostException: linux-208
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:519)
at java.net.Socket.connect(Socket.java:469)
at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:233)
at sun.net.www.http.HttpClient.New(HttpClient.java:306)
at sun.net.www.http.HttpClient.New(HttpClient.java:323)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:852)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:793)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:718)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:896)
at org.jboss.invocation.http.interfaces.Util.invoke(Util.java:145)
at org.jboss.invocation.http.interfaces.HttpInvokerProxy.invoke(HttpInvokerProxy.java:103)
... 12 more

解决方案 »

  1.   

    自己搞定了。原因如下上面的代码理论上可以通过RMI/HTTP方式进行调用。但实际测试中发现,如果按jboss的默认配置安装,可以正常访问JNDI但无法正常访问EJB,。在调用InitialContext的lookup时,总会抛出UnknownHostException。通过修改jboss的http-invoker.sar的默认配置来解决它。打开jboss\ server\default\deploy\http-invoker.sar\META-INF目录下的jboss-service.xml文件。将文件中所有的UseHostName属性的值都改为false。