`
raymond.chen
  • 浏览: 1418779 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在Spring环境下使用RMI

阅读更多

在Spring环境使用RMI时,可以省略以下几点:

     1、接口类不需要继承Remote,方法不需要抛出RemoteException异常对象。

     2、实现类不需要继承UnicastRemoteObject。

     3、RMI服务自动注册。

 

下面通过具体的例子来说明其用法。

 

一、导出RMI服务

     1、bean的配置

<beans>
	<bean id="syncServiceImpl" class="com.cjm.service.rmi.SyncServiceImpl" />
	
	<bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
		<property name="port" value="3015"/>
    </bean>

	<bean id="syncServiceProxy" class="com.cjm.service.rmi.SyncServiceRMIExporter">
		<property name="service">
			<ref bean="syncServiceImpl" /> <!-- 服务对象 -->
		</property>
		<property name="serviceName">
			<value>hawkeyeService</value> <!-- 服务名 -->
		</property>
		<property name="serviceInterface">
			<value>com.cjm.service.rmi.SyncService</value> <!-- 服务接口类 -->
		</property>
		<property name="servicePort">
			<value>1099</value>
		</property>

		<!-- 服务端口 
		<property name="registryPort">
			<value>3015</value> 
		</property>-->
		<property name="registry" ref="registry"/>
  
		<property name="registryHost">
			<value>${rmiServerIp}</value>
		</property>
	</bean>
</beans>

  

    2、类源码

public class SyncServiceRMIExporter extends RmiServiceExporter{
	public SyncServiceRMIExporter() {
		//通过系统属性设置RMI的hostname
		System.setProperty("java.rmi.server.hostname", "localhost"); 
	}
}

 

//RMI服务接口类
public interface SyncService{
	public boolean updateMonicaSiInfos(String oldInfo, String newInfo);
}

 

public class SyncServiceImpl implements SyncService {
  	@Override
  	public boolean updateMonicaSiInfos(String oldInfo, String newInfo) {
  		oldInfo = StringUtils.trimToEmpty(oldInfo);
  		newInfo = StringUtils.trimToEmpty(newInfo);

  		if (StringUtils.isEmpty(newInfo)) {
  			return false;
  		}
  		
  		......
  		
  		logger.warn("成功: oldInfo=" + oldInfo + ", newInfo=" + newInfo);
  		return true;
  	}
}

 

二、调用RMI服务

     1、bean的配置

<beans>   
	<bean id="serviceImpl" class="RMIServiceImpl">
		<property name="syncService" ref="hawkeyeService"/>
	</bean>
	
	<bean id="hawkeyeService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">        
		<property name="serviceUrl">            
			<value>rmi://localhost:1099/hawkeyeService</value> <!-- RMI服务地址 -->        
		</property>        
		<property name="serviceInterface">            
			<value>com.cjm.service.rmi.SyncService</value> <!-- RMI服务接口类 -->         
		</property>   
		<property name="lookupStubOnStartup" value="false"/> 
		<property name="refreshStubOnConnectFailure" value="true"/>  
	</bean>
</beans>

 

    2、类源码

public class RMIServiceImpl {
	private SyncService syncService;

	public SyncService getSyncService() {
		return syncService;
	}

	public void setSyncService(SyncService syncService) {
		this.syncService = syncService;
	}
	
	public void doAction(String oldValue, String newValue)throws Exception{
		boolean b = syncService.updateMonicaSiInfos(oldValue, newValue);
		if(b){
			System.out.println("RMI调用成功");
		}else{
			System.out.println("RMI调用失败");
		}
	}
}

  

    通过Spring导出的RMI服务由于其接口类没有继承Romote接口,所以,在非Spring环境下调用RMI时,不是返回服务接口对象,而是返回RmiInvocationWrapper_Stub实例,然后通过反射方式来调用具体的服务方法,下面给出范例的源码供参考:

Context context = new InitialContext();
RmiInvocationWrapper_Stub stub = (RmiInvocationWrapper_Stub)context.lookup("rmi://localhost:3016/hawkeyeService");

Object[] arguments = new Object[]{"", "9999", "", ""};
Class[] parameterTypes = new Class[]{String.class, String.class, String.class, String.class};

RemoteInvocation invocation = new RemoteInvocation();
invocation.setMethodName("updateMonicaSiInfos");
invocation.setArguments(arguments);
invocation.setParameterTypes(parameterTypes);

RMIFeedback feedback = (RMIFeedback)stub.invoke(invocation);

 

2
1
分享到:
评论

相关推荐

    spring rmi 源码

    spring rmi 远程调用服务端和客户端源码,eclipse环境,jdk1.7.

    spring jar 包详解

    spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应用系统中是用不得这些类...

    最新最全的spring开发包

    spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应用系统中是用不得这些类的...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    spring jar 包详解spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应用系统...

    Spring-Reference_zh_CN(Spring中文参考手册)

    12.6.1. 在Spring环境中建立JPA 12.6.1.1. LocalEntityManagerFactoryBean 12.6.1.2. LocalContainerEntityManagerFactoryBean 12.6.1.3. 处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于...

    Spring 2.0 开发参考手册

    12.6.1. 在Spring环境中建立JPA 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与...

    Spring中文帮助文档

    12.6.1. 在Spring环境中建立JPA 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.7. 事务管理 12.8. JpaDialect III. The Web 13. Web MVC framework Web框架 13.1...

    Spring API

    12.6.1. 在Spring环境中建立JPA 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.7. 事务管理 12.8. JpaDialect III. The Web 13. Web MVC framework Web框架 13.1...

    spring chm文档

    12.6.1. 在Spring环境中建立JPA 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与...

    RMI学习笔记

    这里讲述的是基于JDK1.5的RMI程序搭建,更简单的说是一个 HelloWorld RMI。 这里是把客户端和服务器端的两个程序,分布在两个独立的程序里面,是真正的分布式。 还包括spring环境下RMI的配置

    Spring攻略(第二版 中文高清版).part1

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    Spring in Action(第2版)中文版

    16.4.3在jsf页面中使用springbean 16.4.4在jsf中暴露应用程序环境 16.5spring中带有dwr的支持ajax的应用程序 16.5.1直接web远程控制 16.5.2访问spring管理的beandwr 16.6小结 附录a装配spring a.1下载spring ...

    Spring in Action(第二版 中文高清版).part2

    16.4.3 在JSF页面中使用Spring Bean 16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 ...

    Spring in Action(第二版 中文高清版).part1

    16.4.3 在JSF页面中使用Spring Bean 16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    10.3 利用Spring在JSP页面输出“HelloWorld”的示例 10.3.1 建立myHelloWorld工程 10.3.2 编写JSP页面helloWorld.jsp 10.3.3 编写控制器HelloWorldController.java 10.3.4 建立Spring的配置文档dispatcherServlet-...

    Spring攻略(第二版 中文高清版).part2

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    10.3 利用Spring在JSP页面输出“HelloWorld”的示例 10.3.1 建立myHelloWorld工程 10.3.2 编写JSP页面helloWorld.jsp 10.3.3 编写控制器HelloWorldController.java 10.3.4 建立Spring的配置文档dispatcherServlet-...

    Spring整合Ecache

    本实例的环境 eclipse + maven + spring + ehcache + junit EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开 源Java分布式缓存。主要...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    10.3 利用Spring在JSP页面输出“HelloWorld”的示例 10.3.1 建立myHelloWorld工程 10.3.2 编写JSP页面helloWorld.jsp 10.3.3 编写控制器HelloWorldController.java 10.3.4 建立Spring的配置文档dispatcherServlet-...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    10.3 利用Spring在JSP页面输出“HelloWorld”的示例 10.3.1 建立myHelloWorld工程 10.3.2 编写JSP页面helloWorld.jsp 10.3.3 编写控制器HelloWorldController.java 10.3.4 建立Spring的配置文档dispatcherServlet-...

Global site tag (gtag.js) - Google Analytics