spring rmi 简单使用

24 篇文章 0 订阅

相关概述

RMI是 Java的一组拥护开发 分布式应用程序API。RMI使用Java语言 接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说,这样使原先的 程序在同一 操作系统的方法调用,变成了不同操作系统之间 程序的方法调用,由于J2EE是分布式程序平台,它以RMI机制实现程序组件在不同操作系统之间的通信。比如,一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。
RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发 分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络 分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于 分布式对象系统。而Java RMI 则支持 存储于不同 地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程 消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java RMI具有Java的“Write Once,Run Anywhere”的优点,是 分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
Java Remote Method Invocation ( RMI -- Java远程方法调用)允许您使用Java编写 分布式对象。本文将介绍RMI的优点以及如何将其连接到现有的和原有的系统中,以及与用Java 编写的组件的连接。
RMI为采用Java对象的 分布式计算提供了简单而直接的途径。这些对象可以是新的Java对象,也可以是围绕现有API的简单的Java包装 程序。Java体现了“编写一次就能在任何地方运行的 模式。而RMI可将Java 模式进行扩展,使之可在任何地方运行”。
因为RMI是以Java为核心的,所以,它将Java的安全性和可移植性等强大功能带给了分布式计算。您可将代理和梢?务逻辑等属性移动到网络中最合适的地方。如果您要扩展Java在系统中的使用,RMI将使您充分利用其强大功能。
RMI可利用标准Java本机方法 接口JNI [1] 与现有的和原有的系统相连接。RMI还可利用标准JDBC包与现有的关系数据库连接。RMI/JNI和RMI/JDBC相结合,可帮助您利用RMI与目前使用非 Java语言的现有 服务器进行通信,而且在您需要时可扩展Java在这些服务器上的使用。RMI可帮助您在扩展使用时充分利用Java的强大功能。

RMI系统运行机理

RMI 应用程序通常包括两个独立的 程序服务器程序和客户机程序。典型的 服务器 应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。而典型的客户机程序则从 服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为 服务器和客户机进行通信和信息传递提供了一种机制。
在与远程对象的通信过程中,RMI使用标准机制:stub和skeleton。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用 程序将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在RMI中,远程对象的stub与该远程对象所实现的远程 接口集相同。调用stub的方法时将执行下列操作:
(1) 初始化与包含远程对象的远程 虚拟机的连接;
(2) 对远程 虚拟机的参数进行编组(写入并传输);
(3) 等待方法调用结果;
(4) 解编(读取)返回值或返回的异常;
(5) 将值返回给调用 程序。为了向调用 程序展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节隐藏了起来。在远程 虚拟机中,每个远程对象都可以有相应的skeleton(在JDK1.2环境中无需使用skeleton)。Skeleton负责将调用分配给实际的远程对象实现。它在接收方法调用时执行下列操作:(1) 解编(读取)远程方法的参数;(2) 调用实际远程对象实现上的方法;(3) 将结果(返回值或异常)编组(写入并传输)给调用 程序。stub和skeleton由rmic 编译器生成。
利用RMI编写 分布式对象 应用程序需要完成以下工作:(1) 定位远程对象。 应用程序可使用两种机制中的一种得到对远程对象的引用。它既可用RMI的简单命名工具rmiregistry来注册它的远程对象,也可以将远程对象引用作为常规操作的一部分来进行传递和返回。(2)与远程对象 通信。远程对象间通信的细节由RMI处理,对于 程序员来说,远程通信看起来就像标准的Java方法调用。(3)给作为参数或返回值传递的对象加载类 字节码。因为RMI允许调用 程序将纯Java对象传给远程对象,所以,RMI将提供必要的机制,既可以加载对象的代码又可以传输对象的数据。在RMI 分布式应用程序运行时, 服务器调用注册服务程序以使名字与远程对象相关联。客户机在 服务器上的注册服务 程序中用远程对象的名字查找该远程对象,然后调用它的方法。
 
用Spring的RMI支持,你可以通过RMI基础设施透明的暴露你的服务。设置好Spring的RMI支持后,你会看到一个和远程EJB接口类似的配置,只是没有对安全上下文传递和远程事务传递的标准支持。这可大大简化rmi的使用

1.使用RmiServiceExporter暴露服务

 

   使用RmiServiceExporter,我们可以把对象的接口暴露成RMI对象。可以使用 RmiProxyFactoryBean 或者在传统RMI服务中使用普通RMI来访问该接口。RmiServiceExporter 显式地支持使用RMI调用器暴露任何非RMI的服务。当然,我们首先需要在Spring容器中设置我们的服务:

新建一个userDao的接口 及userDaoImpl实现类

userDao

package com.soyen.dao;

public interface UserDao {
 public String login(String username,String password);
}


 

 

UserDaoImpl

package com.soyen.dao.impl;

import com.soyen.dao.UserDao;

public class UserDaoImpl implements UserDao {

 public String login(String username, String password) {
  return "你好" + username + "你的密码为:" + password;
 }

}



 

 现将服务端配置代码贴上

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 <bean id="userDao" class="com.soyen.dao.impl.UserDaoImpl"></bean>
  <!-- 将类暴露成为一个RMI服务 -->
 <bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">  
    <!-- 服务类 -->
  <property name="service" ref="userDao" />   
    <!-- 服务名 -->
  <property name="serviceName" value="UserService" />   
        <!-- 服务接口 -->
  <property name="serviceInterface" value="com.soyen.dao.UserDao" />
         <!-- 服务端口默认为1199-->
  <property name="registryPort" value="1091" />
 </bean>
</beans>


 
客户端采用java控制台程序测试,须将服务端接口提供给客户端
 
import org.springframework.remoting.rmi.RmiProxyFactoryBean;

import com.soyen.dao.UserDao;


public class TestRmi {
public static void main(String[] args) {
  
  
  RmiProxyFactoryBean factory = new RmiProxyFactoryBean();   
        factory.setServiceInterface(UserDao.class);   
        factory.setServiceUrl("rmi://localhost:1091/UserService");   
        factory.afterPropertiesSet();   
           
        UserDao userService = (UserDao)factory.getObject();   
        String msg=userService.login("zhangsan", "12344");  
        System.out.println(msg);       
       

  
 }

}



执行完毕则可调用
 
若客户端采用配置方式则可使用一下配置
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 <bean id="rmiService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">  
    <property name="serviceInterface" value="com.soyen.dao.UserDao" ></property>
    <property name="serviceUrl" value="rmi://localhost:1091/UserService"></property>
 </bean>
</beans>

 
 
 
 
 
 
 
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值