1. 程式人生 > >Spring 實現遠端訪問詳解——rmi

Spring 實現遠端訪問詳解——rmi

一.  緒論

Spring為各種遠端訪問技術提供整合工具類。Spring遠端訪問通過使用普通POJOs,能更容易的開發遠端訪問服務。目前,Spring遠端訪問的主要技術如下:

1.      遠端呼叫RMI(Remote Method Invocation): 通過使用RmiProxyFactoryBean 和 RmiServiceExporter,並且,Spring支援兩個傳統的RMI(使用 java.rmi.Remote介面和java.rmi.RemoteException)和通過RMI呼叫器實現的暴露遠端呼叫(支援任何Java介面)。

2.      Spring的HTTP呼叫器(Spring’sHttp Invoker): Spring提供了一種特殊的允許通過HTTP進行Java序列化的遠端呼叫策略,支援任意Java介面(就像RMI呼叫器)。相對應的支援類是 HttpInvokerProxyFactoryBean和 HttpInvokerServiceExporter。

3.      Hessian: 通過HessianProxyFactoryBean 和 HessianServiceExporter,可以使用Caucho提供的基於HTTP的輕量級二進位制協議來透明地暴露服務。

4.      Burlap: Burlap是Caucho的另外一個子專案,可以作為Hessian基於XML的替代方案。Spring提供了諸如BurlapProxyFactoryBean 和 BurlapServiceExporter 的支援類。

5.      JAX RPC: Spring通過JAX-RPC為遠端Web服務提供支援(J2EE1.4's web service API)。

6.      JAX-WS:Spring通過JAX-WS為遠端Web服務提供支援(thesuccessor of JAX-RPC, as introduced in Java EE 5 and Java 6)。

7.      JMS:遠端訪問通過類JmsInvokerServiceExporter和JmsInvokerProxyFactoryBean使用JMS的底層協議實現。

本文主要實現基於RMI(遠端方法呼叫)的遠端訪問技術。

二. 遠端訪問------RMI  

 1. RMI遠端訪問基本流程

    1). 服務端定義遠端訪問介面;

    2). 服務端通過RmiServiceExporter暴露服務介面

    3). 客戶端定義與服務端已暴露的相同介面

    4). 客戶端通過RmiProxyFactoryBean呼叫服務介面

2.  RMI---伺服器

1).服務端定義遠端訪問介面

<span style="font-family:Times New Roman;"><span style="font-family:Microsoft YaHei;font-size:18px;">package com.lm.core.service;

import java.util.List;

import com.lm.core.entity.User;

public interface UserRmiService {
	List<User> getUserByAcount(String name,String password);
	
	void insert(User user);
}
</span></span>

2). 介面實現

<span style="font-family:Times New Roman;"><span style="font-family:Microsoft YaHei;font-size:18px;">package com.lm.core.service.impl;
 
import java.util.ArrayList;
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
 
import com.lm.core.entity.User;
import com.lm.core.mapper.UserMapper;
import com.lm.core.service.UserRmiService;
 
public class UserRmiServiceImpl implements UserRmiService {
 
    @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> getUserByAcount(String name, String password) {
       System.err.println("獲取使用者資訊:" + name + password);
       return new ArrayList<User>();
    }
    @Override
    public void insert(User user) {
       System.err.println("開始插入使用者資訊:" + user.toString());
    }
 
}</span></span>

3). spring配置暴露介面

<span style="font-family:Times New Roman;"><span style="font-family:Microsoft YaHei;font-size:18px;"><!-- spring rmi-->
    <bean name="urseRmiService" class="com.lm.core.service.impl.UserRmiServiceImpl"/>
    <bean name="rmiTest" class="org.springframework.remoting.rmi.RmiServiceExporter">
       <property name="service"ref="urseRmiService" />
       <property name="serviceName"value="urseRmiServiceTest" />
       <property name="serviceInterface"value="com.lm.core.service.UserRmiService"/>
       <property name="registryPort"value="1021" />
    </bean></span></span>

4). 客戶端定義相同暴露的介面

<span style="font-family:Times New Roman;"><span style="font-family:Microsoft YaHei;font-size:18px;">packagecom.lm.core.service;
 
importjava.util.List;
 
importcom.lm.core.entity.User;
 
public interfaceUserRmiService {
         List<User> getUserByAcount(Stringname,String password);
        
         void insert(User user);
}</span></span>

5). Spring配置遠端訪問介面資訊

<span style="font-family:Times New Roman;"><span style="font-family:Microsoft YaHei;font-size:18px;">  <!-- spring rmi -->
    <bean id="clientRmiTest" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
       <property name="serviceUrl"value="rmi://127.0.0.1:1021/urseRmiServiceTest"/> 
        <property name="serviceInterface" value="com.lm.core.service.UserRmiService"/> 
        <property name="lookupStubOnStartup" value="false"/>
        <property name="refreshStubOnConnectFailure" value="true"></property>
    </bean></span></span>

lookupStubOnStartup預查詢遠端物件預設為true

refreshStubOnConnectFailure是否重新整理遠端呼叫快取的stub

注意:如果上述兩項不配置,當伺服器未開啟,客戶端無法打包,會有拒絕連線異常。


6). 客戶端呼叫伺服器介面

<span style="font-family:Times New Roman;"><span style="font-family:Microsoft YaHei;font-size:18px;">package com.lm.web.controller;
 
import org.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import com.lm.core.service.UserRmiService;
import com.lm.web.vo.BaseMapVo;
 
@Controller
@RequestMapping(value = "/user")
public class UserController {
 
   
    @SuppressWarnings("resource")
    @RequestMapping(value = "/rmiTest")
    @ResponseBody
    public BaseMapVo rmiTest(String name, String password) {
       BaseMapVo vo = new BaseMapVo();
       System.out.println("rmi客戶端開始呼叫");
       ApplicationContext ctx = new ClassPathXmlApplicationContext(
              "classpath:application-context.xml");
       UserRmiService rmi = (UserRmiService) ctx.getBean("clientRmiTest");
       rmi.getUserByAcount("張三", ":張三的密碼");
       System.out.println("rmi客戶端呼叫結束");
       vo.setRslt("sucess");
       return vo;
    }
}</span></span>

7).輸出和結果



上述就為本文所有內容,

相關推薦

Spring 實現遠端訪問——rmi

一.  緒論 Spring為各種遠端訪問技術提供整合工具類。Spring遠端訪問通過使用普通POJOs,能更容易的開發遠端訪問服務。目前,Spring遠端訪問的主要技術如下: 1.      遠端呼叫

Spring Aop底層原理(利用spring後置處理器實現AOP)

寫在前面:對於一個java程式設計師來說,相信絕大多數都有這樣的面試經歷,面試官問:你知道什麼是aop嗎?談談你是怎麼理解aop的?等等諸如此類關於aop的問題。當然對於一些小白可能會一臉懵逼;對於一些工作一兩年的,可能知道,哦!aop就是面向切面變成,列印日誌啊,什麼什麼的,要是有點學

Spring Boot 學習之路——4.1 AOP註解方式實現列印日誌

以下內容轉自:https://www.cnblogs.com/lixiang1993/p/7447853.html1.宣告一個切面類,並把這個切面類加入到IOC容器中@Component@Aspectpublic class LogAspect{    @Pointcut(v

elasticSearch+spring 整合 maven依賴

elastics tail -s clas 1.0 too group nbsp snapshot 摘自:http://www.mayou18.com/detail/nTxPQSyu.html 【Elasticsearch基礎】elasticSearch+spring 整合

spring配置文件

type ransac 啟動 toc ref 意圖 new admins 裝配 轉自: http://book.51cto.com/art/201004/193743.htm 此處詳細的為我們講解了spring2.5的實現原理,感覺非常有用

筆記:Spring Cloud Ribbon RestTemplate

定義 方法 template 包含 mediatype pst ron request temp 詳細介紹RestTemplate 針對幾種不同請求類型和參數類型的服務調用實現,示例代碼中的 restTemplate 都是通過Spring 註

spring 依賴註入

3.1 代碼 peak mxml 手動 初始化 org contex thum 當我們對一個javaBean進行實例化時,在原本的情況下我們會選擇新建一個接口,然後進行實例化,為了進一步降低耦合度我們還會使用工廠模式進行封裝。 例: 當我們想要去造,Chinese、Amer

Spring MVC整合Velocity

springmvcvelocity一、Velocity簡介Velocity是一個基於java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。當Velocity應用於web開發時,界面設計人員可以和java程序

Spring:jar包

bsp bject 表達 title node unit 調度 緩存 support org.springframework.aop ——Spring的面向切面編程,提供AOP(面向切面編程)的實現 org.springframework.asm——spring 2.

Spring Boot 之 HelloWorld

www repos lookup dex lns jar nap put epo SpringBoot介紹~<暫時假裝有> 配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht

java retry(重試) spring retry, guava retrying

warn llb 序號 @service call 模板 out ble 結束 系列說明 java retry 的一步步實現機制。 java-retry 源碼地址 情景導入 簡單的需求 產品經理:實現一個按條件,查詢用戶信息的服務。 小明:好的。沒問題。 代碼 Use

Spring MVC @RequestMapping註解(2)

並不是 value get ecif 使用 .com java代碼 處理方法 分開 @RequestMapping 參數說明   value:定義處理方法的請求的 URL 地址。(重點)   method:定義處理方法的 http method 類型,如 GET、POST

Spring MVC之@RequestMapping Spring MVC之@RequestMapping

轉自原文 Spring MVC之@RequestMapping 詳解 引言: 前段時間專案中用到了REST風格來開發程式,但是當用POST、PUT模式提交資料時,發現伺服器端接受不到提交的資料(伺服器端引數繫結沒有加 任何註解),查看了提交方式為application/json, 而且伺服器端通過requ

noVNC+VNCserver實現遠端訪問Docker容器桌面

一、實驗環境 主機:Ubuntu16.04 目標機:docker容器 說明:在主機Ubuntu16.04中安裝docker,並虛擬出一臺Ubuntu容器,將該容器作為要遠端訪問的目標機 二、實現過程 1.在docker容器中安裝vnc4server,並啟動vnc4serv

Spring Boot異常處理

在Spring MVC異常處理詳解中,介紹了Spring MVC的異常處理體系,本文將講解在此基礎上Spring Boot為我們做了哪些工作。下圖列出了Spring Boot中跟MVC異常處理相關的類。 Spring Boot在啟動過程中會根據當前環境進行AutoConfigurat

spring-boot入門程式

1.建立一個普通的maven專案,專案名為boot-learnning 2.在pom.xml新增parent依賴 <parent> <groupId>org.springframework.boot</groupId> <

springboot整合quartz定時器實現定時任務

最近需要 做一個按照時間,定時初始化一些資訊的功能,研究了一下quartz,也簡單瞭解一下TimerTask,廢話不多說。 quartz和TimerTask的區別: timer是jdk自帶的(可想而知,肯定是不怎麼好用)。 Quartz可以通過cron表示式精確到特定時間執行,而T

saltstack安裝及遠端執行

salt安裝 第一步 主機名區分好,十分關鍵 centos7 設定主機名方式 hostnamectl set-hostname centos7   1 在master節點上 192.168.255.128 curl -o /etc/yum.repos.d/epel-

前端以canvas實現驗證碼

前端實現驗證碼生成 實現此功能,可以先拆分出驗證碼有以下要素: 隨機凌亂字元生成 隨機的背景色調 隨機出現的遮擋線與點 要實現此功能我們可以使用css3中canvas元素,通過js我們可以 非常簡單的實現前端生成驗證碼。 下面讓我們逐項實現 我們先在