歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Spring RMI 簡單使用

Spring RMI 簡單使用

日期:2017/3/1 9:49:52   编辑:Linux編程

相關概述

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/beans http://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/beans http://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>

Spring 的詳細介紹:請點這裡
Spring 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved