Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。使用spring对RMI的支持,可以非常容易地构建分布式应用。这种C/S模型的访问方式,可以屏蔽掉RMI本身的复杂性,如服务端Skeleton和客户端Stub等的处理细节,这些对于服务开发和服务使用的人员来说,都是透明的,无需过度关注,而集中精力开发你的商业逻辑。主要操作是两个方面:

在服务端:可以通过org.springframework.remoting.rmi.RmiServiceExporter可以暴露你的服务;

在客户端:可以通过org.springframework.remoting.rmi.RmiProxyFactoryBean可以使用服务端暴露的服务,非常方便。


服务端端发布服务:

1 spring配置文件spring-mvc.xml如下指定了暴露的服务的名称,通过serviceName属性注入到RmiServiceExporter中,服务名称为RmiService,客户端通过该服务名称就能够进行调用

    
     
      
          
        
          
        
          
        
          
        
    


2  服务定义业务逻辑的接口和实现类

//定义接口
public interface RmiService {
	public String getAccessToken();
	public String getTicket() ;
	public JSONObject sendMsg(JSONObject data,String toUserId,String toOpenId,String templateId,String url);
}

//该接口的实现类
public class RmiServiceImpl implements RmiService {
    .....
}


客户端口调用服务

1 客户端client.xml配置:配置中,将一个serviceUrl和serviceInterface注入给RmiProxyFactoryBean,即可进行远程方法调用。调用示例如下所示


	
		
		
		
		
	


2 客户端的实现类:


public interface RmiClientService {	
	public String getAccessToken();
	public String getTicket() ;
	public JSONObject sendMsg(JSONObject data,String toUserId,String toOpenId,String templateId,String url);
}


代码实现:这样就可以实现接口映射,实现远程调用服务端接口的。可用注解方式,或者直接调用client.xml方式调用

...
public RmiClientService rmiService;
@Test
public void testMsg() {
	......
*/    	rmiService.sendMsg(data, "674581a5310145c9888cae", "oGUg1wok3VAsG6qYX1Kg1", ConStant.wechatmsgmode_rztg, "");// 发送微信消息
}


public static void main(String[] args) {  
        ApplicationContext ctx = new ClassPathXmlApplicationContext(  
                "org/xxx/xxx/xx/client.xml");  
        RmiClientService service = (RmiClientService) ctx  
                .getBean("rmiService");  
        service.sendMsg(data, "674581a5310145c9888cae", "oGUg1wok3VAsG6qYX1Kg1", ConStant.wechatmsgmode_rztg, "");// 发送微信消息 
    }