Java 如何在JBoss的默认RMI注册表中注册服务器,并从运行在另一个JVM中的客户端访问它?

Java 如何在JBoss的默认RMI注册表中注册服务器,并从运行在另一个JVM中的客户端访问它?,java,jboss,rmi,jackrabbit,Java,Jboss,Rmi,Jackrabbit,我试图通过RMI访问部署在应用服务器上的存储库 当我尝试使用ClientRepositoryFactory.getRepository()连接到工厂时,出现以下异常:rmi://xxx.xxx.xxx.xxx:1099/imageserver'). 但是,如果我创建一个web应用程序,在服务器上使用不同的端口启动一个新的RMI注册表,并在该新注册表中注册Jackrabbit,它就会工作 但是,我需要对默认JBoss配置进行最小的调整,以使其正常工作。那么,谁能解释一下问题的原因呢。我在其他地方看

我试图通过RMI访问部署在应用服务器上的存储库

当我尝试使用ClientRepositoryFactory.getRepository()连接到工厂时,出现以下异常:rmi://xxx.xxx.xxx.xxx:1099/imageserver'). 但是,如果我创建一个web应用程序,在服务器上使用不同的端口启动一个新的RMI注册表,并在该新注册表中注册Jackrabbit,它就会工作

但是,我需要对默认JBoss配置进行最小的调整,以使其正常工作。那么,谁能解释一下问题的原因呢。我在其他地方看到了很多关于同一主题的帖子,我们尝试了所有可能的(和许多不可能的)建议解决方案

org.apache.jackrabbit.rmi.client.RemoteRuntimeException: java.rmi.ConnectIOException: non-JRMP server at remote endpoint
    org.apache.jackrabbit.rmi.client.SafeClientRepository.getDescriptor(SafeClientRepository.java:81)
    com.btmatthews.freelancer.webapp.servlet.TestServlet.doGet(TestServlet.java:39)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
root cause

java.rmi.ConnectIOException: non-JRMP server at remote endpoint
    sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:230)
    sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
    sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
    sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    java.rmi.Naming.lookup(Naming.java:84)
    org.apache.jackrabbit.rmi.client.ClientRepositoryFactory$1.getRemoteRepository(ClientRepositoryFactory.java:95)
    org.apache.jackrabbit.rmi.client.SafeClientRepository.getDescriptor(SafeClientRepository.java:77)
    com.btmatthews.freelancer.webapp.servlet.TestServlet.doGet(TestServlet.java:39)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

我认为您可能需要使用JNP客户端,这与IIOP和JRMP不同。这就是JBoss在1099年公开的协议。这意味着您可能需要使用以下内容配置初始上下文:

Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial",
        "org.jnp.interfaces.NamingContextFactory");
env.put("java.naming.provider.url", "jnp://localhost:1099");
env.put("java.naming.factory.url.pkgs",
        "org.jboss.naming:org.jnp.interfaces");

Context context = new InitialContext(env);

Service s = (Service) context.lookup("service");

s.sayHello();
Hashtable env=new Hashtable();
put(“java.naming.factory.initial”,
“org.jnp.interfaces.NamingContextFactory”);
put(“java.naming.provider.url”jnp://localhost:1099");
put(“java.naming.factory.url.pkgs”,
“org.jboss.naming:org.jnp.interfaces”);
上下文=新的初始上下文(env);
服务s=(服务)context.lookup(“服务”);
s、 你好;
或者,您应该在JBoss ear中启动自己的RMI服务器,并在其他端口发布

干杯