`
lxk1314
  • 浏览: 64070 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Spring实现RMI调用

阅读更多
[http://xace.iteye.com/blog/686455]
文章分类:Java编程
传统的实现RMI,需要
1.服务接口必须从Remote派生,每个方法抛出RemoteException
2.实现类必须从UnicastRemoteObject派生
3.所有方法的参数和返回值,必须是基本类型,或者实现了Serializable接口

Java代码 
public class User implements Serializable {  
  private String username;  
  private String password;  
  public User(String username, String password) {  
    this.username = username;  
    this.password = password;  
  }  
  public String getUsername() {  
    return username;  
  }  
  public String getPassword() {  
    return password;  
  }  
}  
public interface RmiUserService extends Remote {  
  User login(String username, String password) throws RemoteException;  
  void create(String username, String password) throws RemoteException;  
}  
public class RmiUserServiceImpl extends UnicastRemoteObject implements RmiUserService {  
  protected RmiUserServiceImpl() throws RemoteException {  
  }  
  private Map<String, String> users = new HashMap<String, String>();  
  public void create(String username, String password) {  
    if (username == null || password == null)  
      throw new IllegalArgumentException("Invalid args.");  
    if (users.get(username) != null)  
      throw new RuntimeException("User exist!");  
    users.put(username, password);  
  }  
  public User login(String username, String password) {  
    if (username == null || password == null)  
      throw new IllegalArgumentException("Invalid args.");  
    if (password.equals(users.get(username)))  
      return new User(username, password);  
    throw new RuntimeException("Login failed.");  
  }  
  public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {  
    LocateRegistry.createRegistry(1099);  
    Naming.bind("rmi://localhost:1099/UserService", new RmiUserServiceImpl());  
  }  
}  
public class Client {  
  public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {  
    RmiUserService service = (RmiUserService) Naming.lookup("rmi://localhost:1099/UserService");  
    service.create("xace", "1");  
    System.out.println(service.login("xace", "1"));  
  }  
}  
 
调用:  
>rmic RmiUserServiceImpl  
>java Client 

public class User implements Serializable {
  private String username;
  private String password;
  public User(String username, String password) {
    this.username = username;
    this.password = password;
  }
  public String getUsername() {
    return username;
  }
  public String getPassword() {
    return password;
  }
}
public interface RmiUserService extends Remote {
  User login(String username, String password) throws RemoteException;
  void create(String username, String password) throws RemoteException;
}
public class RmiUserServiceImpl extends UnicastRemoteObject implements RmiUserService {
  protected RmiUserServiceImpl() throws RemoteException {
  }
  private Map<String, String> users = new HashMap<String, String>();
  public void create(String username, String password) {
    if (username == null || password == null)
      throw new IllegalArgumentException("Invalid args.");
    if (users.get(username) != null)
      throw new RuntimeException("User exist!");
    users.put(username, password);
  }
  public User login(String username, String password) {
    if (username == null || password == null)
      throw new IllegalArgumentException("Invalid args.");
    if (password.equals(users.get(username)))
      return new User(username, password);
    throw new RuntimeException("Login failed.");
  }
  public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException {
    LocateRegistry.createRegistry(1099);
    Naming.bind("rmi://localhost:1099/UserService", new RmiUserServiceImpl());
  }
}
public class Client {
  public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {
    RmiUserService service = (RmiUserService) Naming.lookup("rmi://localhost:1099/UserService");
    service.create("xace", "1");
    System.out.println(service.login("xace", "1"));
  }
}

调用:
>rmic RmiUserServiceImpl
>java Client


Spring对RMI提供的支持
不用写一行代码,直接在Spring的配置文件中声明,就可以将一个传统的java类作为RMI服务输出
Xml代码 
<bean id="userService" class="example.rmi.UserServiceImpl" /> 
 
<bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter"> 
  <property name="serviceName" value="UserService"/> 
  <property name="service" ref="userService"/> 
  <property name="serviceInterface" value="example.rmi.UserService"/> 
  <property name="registryPort" value="1099"/> 
</bean> 

  <bean id="userService" class="example.rmi.UserServiceImpl" />

  <bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="UserService"/>
    <property name="service" ref="userService"/>
    <property name="serviceInterface" value="example.rmi.UserService"/>
    <property name="registryPort" value="1099"/>
  </bean>

唯一编写的代码是main()方法,启动Spring容器
Java代码 
public static void main(String[] args) {  
    new ClassPathXmlApplicationContext("config.xml");  


    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("config.xml");
    }
客户端代码
Java代码 
public class Client {  
  public static void main(String[] args) throws Exception {  
    RmiProxyFactoryBean factory = new RmiProxyFactoryBean();  
    factory.setServiceInterface(UserService.class);  
    factory.setServiceUrl("rmi://localhost:1099/UserService");  
    factory.afterPropertiesSet();  
    UserService service = (UserService) factory.getObject();  
    service.create("test", "password");  
    System.out.println(service.login("test", "password"));  
    try {  
      service.login("test", "bad-password");  
    } catch (Exception e) {  
      System.out.println(e.getMessage());  
    }  
  }  


public class Client {
  public static void main(String[] args) throws Exception {
    RmiProxyFactoryBean factory = new RmiProxyFactoryBean();
    factory.setServiceInterface(UserService.class);
    factory.setServiceUrl("rmi://localhost:1099/UserService");
    factory.afterPropertiesSet();
    UserService service = (UserService) factory.getObject();
    service.create("test", "password");
    System.out.println(service.login("test", "password"));
    try {
      service.login("test", "bad-password");
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

如果客户端也在Spring容器中启动,完全可以在XML配置文件中定义UserService并直接使用
Xml代码 
<bean id="userServiceRmi" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> 
  <property name="serviceUrl" value="rmi://localhost:1099/UserService" /> 
  <property name="serviceInterface" value="example.rmi.UserService" /> 
</bean> 

  <bean id="userServiceRmi" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
    <property name="serviceUrl" value="rmi://localhost:1099/UserService" />
    <property name="serviceInterface" value="example.rmi.UserService" />
  </bean>

RMI虽然是Java标准的远程调用模式,但是它使用特定的Java Remote Method Protocol二进制协议,很难穿透防火墙,如果要跨防火墙,应该使用HTTP协议为基础的远程调用。
Hessian; Burlap; Spring HTTP Invoker。使用私有协议的Http远程调用没有成为标准,实际应用较少,只能用于Java应用程序之间的远程调用。如果希望和异构平台实现远程调用,就必须使用标准的Web服务(Web Services)
分享到:
评论

相关推荐

    Spring-RMI (RMI调用, HTTP调用)

    Spring通过提供RMI集成,简化了RMI服务的创建和调用。以下是一些关键点: 1. **服务接口定义**:首先,你需要定义一个远程服务接口,这个接口将包含你希望在远程进程中执行的方法。 2. **服务实现**:接着,创建该...

    spring+rmi非本地实现

    总的来说,"spring+rmi非本地实现"项目展示了如何利用Spring和RMI来构建分布式服务,提供了一种跨越网络调用的方法,增强了系统的可扩展性和解耦性。理解和掌握这部分知识对于开发分布式系统具有重要意义。

    java spring+rmi 的远程调用例子

    这个压缩包文件“Spring+RMI”很可能包含了实现这样一个远程调用示例的所有必要组成部分,包括配置文件、接口定义、服务器端实现以及客户端调用代码。 首先,我们来理解一下Java RMI。RMI是Java提供的一种原生的...

    spring和RMI分布式整合源码

    具体到这个压缩包“springRMI”,我们可以推测它可能包含了以下几个部分: 1. **配置文件**:如`applicationContext.xml`,其中定义了Spring容器中的Bean,可能包括RMI服务的接口和实现。 2. **远程接口**:`.java`...

    spring RMI 远程接口调用

    Spring RMI(Remote Method Invocation)远程接口调用是Spring框架提供的一个特性,它允许你在分布式环境中调用对象的方法,使得应用程序能够跨越网络边界操作远程对象。这个技术在大型企业级应用中尤其有用,因为它...

    Spring-RMI.rar_spring rmi

    本文将详细讲解Spring与RMI的整合,以及如何通过"SpringRMIClient"和"SpringRMIServer"这两个示例文件实现跨项目的远程方法调用。 一、Spring整合RMI基础 1.1 RMI原理:RMI的核心在于Java的`java.rmi`包,它定义了...

    Spring RMI

    - **事务支持**:Spring可以为RMI调用提供事务管理,确保操作的原子性和一致性。 ### 4. Spring AOP与RMI结合 Spring的面向切面编程(AOP)可以与RMI集成,提供日志记录、性能监控、安全控制等功能。通过定义切点...

    java Spring+RMI入门程序源代码

    1. **RMI 概念**:RMI 是 Java 平台中的一种标准机制,允许一个 Java 对象调用远程计算机上的另一个 Java 对象的方法,实现远程过程调用。 2. **RMI 组件**:RMI 包括三个主要部分:远程接口(Remote Interface)、...

    Spring RMI小例子

    - 运行客户端,通过RMI调用服务器上的方法,验证通信是否成功。 在这个小例子中,我们可能会看到如下文件: - `RemoteInterface.java`:远程接口定义。 - `RemoteImpl.java`:远程接口的实现。 - `ServerConfig....

    Spring 实现远程访问详解——rmi

    1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,Spring支持两个传统的RMI(使用 java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的...

    SpringRMI小例子

    在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring框架来增强RMI的功能,使其更加灵活和易于管理。 首先,我们需要理解Spring框架在RMI中的角色。Spring提供了对RMI的高级抽象,通过其`org.springframework...

    spring+rmi实现非本地部署

    将Spring与RMI结合,可以实现非本地部署的服务,使得客户端能够跨网络调用服务端的方法。以下是对这个主题的详细阐述: 首先,我们需要理解Spring框架的核心概念。Spring通过依赖注入(Dependency Injection,DI)...

    spring rmi 小例子

    6. **源码分析**:在提供的压缩包文件`SpringRMI`中,可能包含了上述所有步骤的代码示例。通过阅读这些源码,你可以深入理解Spring RMI的工作原理,包括服务暴露、注册、代理创建等。 7. **工具使用**:在开发过程...

    rmi与spring整合实例

    - 在`rmi_spring_client`项目中,包含了客户端的代码,实现了对服务器端RMI服务的调用。 通过上述整合,我们可以构建一个健壮的分布式系统,利用Spring的高级特性管理和控制RMI服务,同时利用RMI实现跨JVM的通信。...

    spring rmi 多接口配置 调用

    本篇文章将深入探讨如何在Spring框架中配置和调用RMI的多个接口。 首先,我们需要了解Spring RMI服务端的配置。服务端的核心在于创建RMI服务接口和其实现。在`SpringRmiServer.zip`中,我们通常会看到以下几个关键...

    spring rmi 集成

    本篇将深入探讨Spring如何与RMI结合,以及客户端和服务器端的实现细节。 ### 一、Spring RMI 服务器端集成 1. **定义远程接口**:首先,我们需要创建一个Java接口,该接口将定义远程服务的方法。例如,我们可以...

    spring rmi应用

    本文将深入探讨“Spring RMI(Remote Method Invocation)应用”,这是Spring框架中用于实现远程方法调用的功能,它使得分布式系统开发变得更加简单。 首先,RMI是Java平台上的一个核心特性,允许在不同JVM之间透明...

    三种方式实现java远程调用(rmi),绝对可用

    在提供的压缩包文件中,"三种方式(原始方式_spring_jndi)实现java远程调用(rmi)"包含了相关的示例代码,帮助开发者理解并实践这三种RMI实现方法。在MyEclipse或其他Java开发环境中导入这些代码,可以进行调试和...

    Spring(RMI)实例

    将Spring与RMI结合使用,可以实现分布式服务的灵活构建。 首先,我们需要理解RMI的基本原理。RMI允许一个Java对象调用位于不同JVM中的另一个对象的方法。这涉及到三个主要步骤:导出远程对象、注册远程对象和调用...

    spring RMI简单例子

    Spring RMI(Remote Method Invocation)是Java平台上的远程方法调用技术,结合Spring框架的特性,使得在分布式系统中调用远程服务变得更加便捷。在这个简单的例子中,我们将深入理解Spring RMI的工作原理以及如何...

Global site tag (gtag.js) - Google Analytics