【问题标题】:RMIServiceExporter not working, does not connect to RMI localhost at port 1099RMIServiceExporter 不工作,无法连接到端口 1099 的 RMI localhost
【发布时间】:2012-04-10 18:33:28
【问题描述】:

我已使用以下配置将 Spring 托管服务 bean 导出到 RMI 服务中:

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
        <property name="serviceName" value="spitterService"/>
        <property name="service" ref="spitterService"/>
        <property name="serviceInterface" value="com.spitter.service.SpitterService"/>
        <property name="registryHost" value="127.0.0.1"/>
        <property name="registryPort" value="1099"/>
 </bean>

但是当我加载我的 spring 配置文件(在 Tomcat 中部署我的应用程序)时,它会抛出以下异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.remoting.rmi.RmiServiceExporter#0' defined in ServletContext resource [/WEB-INF/spitter-servlet.xml]: Invocation of init method failed; nested exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
    java.net.ConnectException: Connection refused: connect
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4681)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5184)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5179)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
    java.net.ConnectException: Connection refused: connect
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
    at sun.rmi.registry.RegistryImpl_Stub.list(Unknown Source)
    at org.springframework.remoting.rmi.RmiServiceExporter.testRegistry(RmiServiceExporter.java:415)
    at org.springframework.remoting.rmi.RmiServiceExporter.getRegistry(RmiServiceExporter.java:326)
    at org.springframework.remoting.rmi.RmiServiceExporter.prepare(RmiServiceExporter.java:264)
    at org.springframework.remoting.rmi.RmiServiceExporter.afterPropertiesSet(RmiServiceExporter.java:227)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
    ... 20 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
    ... 30 more

请帮帮我..提前谢谢

我还创建了一个 rmi 客户端来使用 RMI 服务

public class SpitterMain {

    public static void main(String[] args){
        String serviceURL = "rmi://localhost:1099/spitterService";
        try {
            SpitterService spitterService = (SpitterService) Naming.lookup(serviceURL);
            Spitter spitter = spitterService.getSpitter("panneerselvam");
            List<Spittle> spittles = spitterService.getSpittlesForSpitter(spitter.getId(), 25);

            System.out.println("Welcome>"+spitter.getName()+"( "+spitter.getUsername()+" )");

            System.out.println("Your Recent Spittles are:");

            for(Spittle spittle: spittles){
                System.out.println(spittle.getText()+" ON "+spittle.getWhen());
            }

        } catch (NotBoundException ex) {
            Logger.getLogger(SpitterMain.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(SpitterMain.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RemoteException ex) {
            Logger.getLogger(SpitterMain.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

现在我得到以下异常..

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationHandler (no security manager: RMI class loader disabled)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:84)
    at com.spitter.client.SpitterMain.main(SpitterMain.java:28)
Caused by: java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationHandler (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:535)
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
    at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    ... 3 more

请检查这些家伙...再次感谢

【问题讨论】:

    标签: spring spring-mvc rmi


    【解决方案1】:

    我认为如果您删除 registryHost 属性,它将在 1099 上动态创建一个主机,因为还没有主机。

    <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
        <property name="serviceName" value="spitterService"/>
        <property name="service" ref="spitterService"/>
        <property name="serviceInterface" value="com.spitter.service.SpitterService"/>
        <property name="registryPort" value="1099"/>
    </bean>
    

    要么这样,要么在 1099 上启动 RmiRegistry

    【讨论】:

    • @Gareth Davis 给了你很大的帮助,但你能告诉我为什么我不能在 registryHost 属性中写“localhost”
    • 基本上是因为这行代码github.com/SpringSource/spring-framework/blob/3.0.x/… 如果指定了registryHost,那么它假定它不是localhost(因为这是默认值)并且由于它可能是远程的,所以它不能希望懒惰地创建它
    【解决方案2】:

    您必须创建 myRmiExporter 并扩展 RMIServiceExporter 然后用这个body实现这个方法

    protected Registry getRegistry(String registryHost, int registryPort,
                                       RMIClientSocketFactory clientSocketFactory, RMIServerSocketFactory serverSocketFactory)
                throws RemoteException
        {
    
            if (registryHost != null)
            {
                // Host explictly specified: only lookup possible.
                if (logger.isInfoEnabled())
                {
                    logger.info("Looking for RMI registry at port '" + registryPort + "' of host [" + registryHost + "]");
                }
                try
                {
                    Registry reg = LocateRegistry.getRegistry(registryHost, registryPort, clientSocketFactory);
                    testRegistry(reg);
                    return reg;
                }
                catch (RemoteException ex)
                {
                    logger.debug("RMI registry access threw exception", ex);
                    logger.warn("Could not detect RMI registry - creating new one");
                    // Assume no registry found -> create new one.
                    LocateRegistry.createRegistry(registryPort);
                    Registry reg = LocateRegistry.getRegistry(registryHost, registryPort, clientSocketFactory);
                    testRegistry(reg);
                    return reg;
                }
            }
    
            else
            {
                return getRegistry(registryPort, clientSocketFactory, serverSocketFactory);
            }
        }
    

    成功了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 2012-12-21
      • 2015-10-19
      • 2016-10-18
      • 2011-05-14
      相关资源
      最近更新 更多