Java程序有以下的远程调用技术选择:

远程过程调用(RPC)是同步的,客户端在服务器端返回结果之前将一直被阻塞。

各种技术适用的场景如下:

  典型的RMI开发的过程如下:

  1. 定义一个接口,用于客户端和服务器端的交互,接口要继承Remote接口,所有方法都要抛出RemoteException。
  2. 编写服务器端的实现,实现第一步所编写的接口。
  3. 编写一个注册类,基于某个某个IP和端口(默认是1099)注册服务器端类的实现。
  4. 编写客户端的调用,基于IP,端口和注册的名称查找服务器端对应的类。
  5. RMI支持传递对象,要求对象实现Serializable接口。

  下面是Spring对RMI的支持,配置也很简单:

  一:服务器端

1. 要暴露的服务的接口:

package com.excellence.webservice;

import java.util.List;

public interface AccountService {
public void insertAccount(Account account);
public List getAccounts(String name);
}

  

  2. 实现了该接口的类:

package com.excellence.webservice;

import java.util.List;

public class AccountServiceImpl implements AccountService {

    public void insertAccount(Account account) {
System.out.println("inser!");
} public List getAccounts(String name) {
System.out.println("get");
return null;
}
}

  

  3. 在配置文件中公布改接口为RMI

<bean id="accountService" class="com.excellence.webservice.AccountServiceImpl" />
<bean name="service" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="AccountService" ></property>
<property name="service" ref="accountService"></property>
<property name="serviceInterface" value="com.excellence.webservice.AccountService"></property>
<property name="registryPort" value="1199"></property>
</bean>

  4. 运行该RMI:

public class Demo {

public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext ("classpath:applicationContext.xml");
RmiServiceExporter obj = (RmiServiceExporter)ctx.getBean("service");
}
}

  二、客户端

  1.在配置文件中进行配置:

<bean id="accClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:1199/AccountService"></property>
<property name="serviceInterface" value="com.excellence.webservice.AccountService"></property>
</bean>

  2.调用RMI的方法:

public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext ("classpath:applicationContext.xml");
AccountService service = (AccountService)ctx.getBean("accClient");
service.insertAccount(new Account());
service.getAccounts("dd");
}

  这里需要注意的是:

  从普通RMI改到使用Spring集成RMI时,要将实现类的extends UnicastRemoteObject去掉,否则会报错:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'refreshService' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is java.rmi.server.ExportException: object already exported]       因为UnicastRemoteObject的作用就是生成stub object

Spring对远程服务的支持的更多相关文章

  1. java 利用spring JavaMailSenderImpl发送邮件,支持普通文本、附件、html、velocity模板

    java 利用spring JavaMailSenderImpl发送邮件,支持普通文本.附件.html.velocity模板 博客分类: Java Spring   本文主要介绍利用JavaMailS ...

  2. Spring AOP和AspectJ支持

    学了Spring之后发现我都不知道java为何物-- 在这一章中有好几节,讲的切面编程 第一节:在项目中启用Spring的AspectJ注解支持 第二节:用AspectJ注解声明aspect 第三节: ...

  3. Spring使用拦截器支持国际化(转)

    Spring使用拦截器支持国际化很方便,使用时只需要两个步骤: 一.spring配置 具体配置方式如下: <!-- 资源文件绑定器,文件名称:messages.properties(没有找到时的 ...

  4. 1.Spring对JDBC整合支持

    1.Spring对JDBC整合支持 Spring对DAO提供哪些支持 1)Spring对DAO异常提供统一处理 2)Spring对DAO编写提供支持的抽象类 3)提高编程效率,减少DAO编码量 Spr ...

  5. [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction

    1.Spring中的数据库支持 把具有相同功能的代码模板抽取到一个工具类中.2.关于jdbc template的应用 jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中, ...

  6. Spring Boot 添加JSP支持【转】

    Spring Boot 添加JSP支持 大体步骤: (1)            创建Maven web project: (2)            在pom.xml文件添加依赖: (3)     ...

  7. 8 -- 深入使用Spring -- 8...1 Spring提供的DAO支持

    8.8.1 Spring提供的DAO支持. DAO模式是一种标准的Java EE设计模式,DAO模式的核心思想是,所有的数据库访问都通过DAO组件完成,DAO组件封装了数据库的增.删.查.改等原子操作 ...

  8. 8 -- 深入使用Spring -- 2... Spring的“零配置”支持

    8.2 Spring的“零配置”支持 Spring支持使用Annotation来代替XML配置文件.

  9. Java缓存学习之五:spring 对缓存的支持

    (注意标题,Spring对缓存的支持 这里不单单指Ehcache ) 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache ...

随机推荐

  1. Gym100971B Gym100971C Gym100971F Gym100971G Gym100971K Gym100971L(都是好写的题。。。) IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13, 2016

    昨天训练打的Gym,今天写题解. Gym100971B 这个题就是输出的时候有点小问题,其他的都很简单. 总之,emnnn,简单题. 代码: #include<iostream> #inc ...

  2. RAID 详解

    一.什么是RAID 磁盘阵列全名是『Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘阵列. RAID 可以透过一个技术(软件或 ...

  3. 四 : springMVC各种跳页面传值

    第一种方式 : 返回值为String类型的跳转页面,犯法参数里面需要写Model modelimport org.springframework.ui.Model;包下的.返回String1):字符串 ...

  4. PHP error_reporting() 错误控制函数功能详解

    定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别.   函数语法: error_reporting(report_level)   如果参数 level 未指定 ...

  5. :nth-child(n)

    规定属于其父元素的第二个子元素的每个 p 的背景色: p:nth-child(2) { background:#ff0000; } 1定义和用法 :nth-child(n) 选择器匹配属于其父元素的第 ...

  6. RAC和单节点数据库的区别有哪些?RAC最有用的功能是什么?

    区别 (1)RAC有2个以上的实例,单节点只有1个实例 (2)RAC具有实例级别的高可用 (3)实例与实例之间通过内联网络交换数据,单节点不可 (4)RAC每个节点都有自己套SGA.后台进程.redo ...

  7. Laravel的unique和exists验证规则的优化

    本文是Laravel实战:任务管理系统(一)的扩展阅读 原文链接:http://pilishen.com/posts/Improvements-to-the-Laravel-unique-and-ex ...

  8. 二叉查找树C++实现

    二分查找树特点: (1) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3) 任意节点的左.右子树 ...

  9. Spring MVC CORS 跨域

    介绍 跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing) 当页面发出跨域请求时: 简单请求(先简单理解为正常的get/post吧): ...

  10. border-image用法详解

    图像边框 border-image使用方法:border-image:url('图像路径') 边距(不能带单位)/宽度 上下方式 左右方式:(四个边距,上右下左,相同时可缩写为一个)repeat平铺 ...