Java rmi

以下内容的sample source 放在 https://github.com/zl86790/download/blob/master/java_rmi_sample.zip

Speaker

package name.lizhe.inter;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Speaker extends Remote {
    public String sayHello(String name) throws RemoteException;    
}

SpeakerImpl

package name.lizhe.impl;

import java.io.Serializable;
import java.rmi.RemoteException;

import name.lizhe.inter.Speaker;

public class AppleSpeaker implements Speaker,Serializable {
    
    @Override
    public String sayHello(String name) throws RemoteException {
        
        return "hello "+name;
    }

}

server启动类

package name.lizhe.exe;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Scanner;

import name.lizhe.impl.AppleSpeaker;
import name.lizhe.inter.Speaker;

public class Executor {
    public static void main(String args[]) throws RemoteException, MalformedURLException, AlreadyBoundException{
        Speaker speaker = new AppleSpeaker(); 
        LocateRegistry.createRegistry(8888);  
        Naming.bind("rmi://127.0.0.1:8888/speaker", speaker);  
        Scanner sc = new Scanner(System.in);
        sc.nextLine();
    }
}
 

client

package name.lizhe.exe;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import name.lizhe.inter.Speaker;

public class Client {

    public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
        Speaker speaker = (Speaker) Naming.lookup("rmi://127.0.0.1:8888/speaker");  
        System.out.println(speaker.sayHello("world")); 
    }

}

下面是spring版本

不过很奇怪的是一开始我使用4.2.2版本, 会出现

java.lang.NoClassDefFoundError: org/springframework/expression/ParserContext

换成4.1.6版本之后消失了

新建两个maven项目, pom的内容都一样

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sprmiclient</groupId>
    <artifactId>sprmiclient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <spring-version>4.1.6.RELEASE</spring-version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring-version}</version>
        </dependency>
    </dependencies>

</project>

然后主要的interface 和impl文件和上面的一样

server project 的 applicationContext.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee" 
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd   
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd   
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <bean id="appleSpeakerImpl" class="name.lizhe.impl.AppleSpeaker"> </bean>
    
    <bean id="myRMIServer"  class="org.springframework.remoting.rmi.RmiServiceExporter">
      <property name="serviceName" value="speaker"></property>
      <property name="service" ref="appleSpeakerImpl"></property>
      <property name="serviceInterface" value="name.lizhe.inter.Speaker"></property>
      <property name="registryPort" value="8888"></property>
    </bean>

</beans>

然后启动文件为

package name.lizhe.exe;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Executor {
    public static void main(String args[]){
        new ClassPathXmlApplicationContext("applicationContext.xml");  
    }
}

spring容器会自己阻塞,所以不需要scanner了

启动server项目之后会看到

然后是client project

applicationContext内容是

<?xml version="1.0" encoding="UTF-8" standalone="no"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:aop="http://www.springframework.org/schema/aop"  
       xmlns:context="http://www.springframework.org/schema/context"  
       xmlns:jee="http://www.springframework.org/schema/jee"   
       xmlns:tx="http://www.springframework.org/schema/tx"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd     
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd     
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd     
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  
    <bean id="speakerClient"  class="org.springframework.remoting.rmi.RmiProxyFactoryBean">  
      <property name="serviceInterface" value="name.lizhe.inter.Speaker"></property>  
      <property name="serviceUrl" value="rmi://127.0.0.1:8888/speaker"></property>  
    </bean>  
</beans> 

启动文件为

package name.lizhe;  
  
import java.rmi.RemoteException;

import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;

import name.lizhe.inter.Speaker;  
  
public class SpeakerClient {  
      
    public static void main(String[] args) throws RemoteException {  
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");  
        Speaker speaker =  applicationContext.getBean("speakerClient",Speaker.class);  
        System.out.println(speaker.sayHello("world"));  
    }  
  
}  

启动client项目之后