`

spring rmi入门示例

 
阅读更多

一 前言        (转载自http://www.iteye.com/topic/908016)
    工作环境中,大部分功能,都是基于服务(SOA模式)的,因此用到了rmi.使用他的目的就是让分布式的开发变的简单,同时提高了项目的扩展性,可维护性,可读性.
    rmi有很多种,例如:
1)远程方法调用(RMI)
2)Spring自己的HTTP invoker
3)EJB
4)Web Services
......
本文选择了spring的rmi接口进行分布式开发应用.具体用哪种rmi,我们还需要深入的挖掘.本文不作讨论.
    至于具体哪里简单呢?需要朋友们深入了解java的远程方法调用(RMI).服务端的接口要继承java.rmi.Remote接口.启动类需要继承java.rmi.server.UnicastRemoteObject类.而且诸如服务器地址等配置信息,也不应该放在代码中,因此spring的rmi模式就应运而生了.

二 环境(javaSE项目)
jdk1.6.0.23
eclipse3.6.1_javaee

三 包
1)日志管理
commons-logging-1.1.1.jar
log4j-1.2.16.jar

2)spring核心包
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar

3)aop支持
aopalliance.jar
org.springframework.aop-3.0.5.RELEASE.jar

四 spring基础配置
1)log4j的配置(src/log4j.properties),推荐配置;

log4j.rootLogger=DEBUG,appender1
# org.springframework包下面所有的日志输出的级别设为DEBUG
log4j.logger.org.springframework=INFO
# 控制台输出
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n
# 立即输出
log4j.appender.appender1.immediateFlush=true

 
2)commons-logging的配置(src/commons-logging.properties):这里是选配的,不配也不会报错,只是为了方便以后日志系统的切换;
3)spring的配置(src/applicationContext.xml),主要是头文件,spring3对头文件的要求很严格;

五 服务端配置与开发
1)开发服务的接口

package com.baidu.phl.rmi.service;

public interface HelloRmiService {
	public int getAdd(int a, int b);
}

 
2)开发服务的实现类

 

package com.baidu.phl.rmi.service.impl;

import com.baidu.phl.rmi.service.HelloRmiService;

public class HelloRmiServiceImpl implements HelloRmiService {

	public int getAdd(int a, int b) {
		return a + b;
	}
}

 
3)配置spring,配置实现类
4)配置spring,注册rmi服务,其中需要说明
a.远程调用服务名
b.提供服务的实现类
c.提供服务的接口
d.提供服务的端口

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/aop  
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!--服务端--> 
	<bean id="helloRmiServiceImpl" class="com.baidu.phl.rmi.service.impl.HelloRmiServiceImpl" scope="prototype"/>
	<!-- 将类为一个RMI服务 -->
	<bean id="myRmi" class="org.springframework.remoting.rmi.RmiServiceExporter">
		<!-- 服务类 -->
		<property name="service" ref="helloRmiServiceImpl" />
		<!-- 服务名 -->
		<property name="serviceName" value="helloRmi" />
		<!-- 服务接口 -->
		<property name="serviceInterface" value="com.baidu.phl.rmi.service.HelloRmiService" />
		<!-- 服务端口 -->
		<property name="registryPort" value="9999" />
		<!-- 其他属性自己查看org.springframework.remoting.rmi.RmiServiceExporter的类,就知道支持的属性了-->
	</bean>
</beans>

 

六 客户端配置与开发
1)将服务端的接口进行打包(注:不需要实现类,只是客户端访问服务端的一个存根)
2)配置spring
a.指定访问服务的地址
b.指定服务的接口

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/aop  
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <!--客户端--> 
    <bean id="myClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> 
        <property name="serviceUrl" value="rmi://127.0.0.1:9999/helloRmi"/> 
        <property name="serviceInterface" value="com.baidu.phl.rmi.service.HelloRmiService"/> 
    </bean> 
</beans>

 

七 测试

    1(服务端测试代码

package com.baidu.phl.rmi.service.test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ServerTest {
	private static Log log = LogFactory.getLog(ServerTest.class);

	public static void main(String[] args) {
		//初始化工作只能运行一次;运行多次的话,会启动多个服务
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		log.info("hello commons-logging!");
	}
}

 

    2(客户端测试代码

 

package com.baidu.phl.rmi.service.test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.baidu.phl.rmi.service.HelloRmiService;

public class ClientTest {
	private static Log log = LogFactory.getLog(ClientTest.class);

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
		HelloRmiService hms = context.getBean("myClient", HelloRmiService.class);
		System.out.println("远程调用返回结果为:"+hms.getAdd(1, 2));
		log.info("远程调用返回结果为:"+hms.getAdd(1, 2));
	}

}

 

 
八 总结
1)接口与类就是java最简单的结构.与RMI无关;
2)客户端必须要有实现类的接口(存根),这样才能访问后实现类的转型,引用与方法调用;
3)本文将服务端和客户端写到了一个工程里,朋友们可以自己将起分离开来使用,但需要注意修改IP地址和开放防火墙相应端口;
4)服务端和客户端都需要使用spring才可以进行rmi的相关开发;

分享到:
评论

相关推荐

    java Spring+RMI入门程序源代码

    本项目提供了一个入门级的源代码示例,帮助开发者理解如何在 Spring 环境下集成 RMI 技术。以下是关于这两个技术及其整合的详细知识点: **Spring 框架** 1. **Spring 概述**:Spring 是一个开源的 Java 应用开发...

    dubbo入门示例,普通Java进程,不使用spring boot cloud

    【标题】"dubbo入门示例,普通Java进程,不使用spring boot cloud" 【描述】这篇博客文章提供了关于如何在不使用Spring Boot Cloud的情况下,基于Java简单进程搭建Dubbo入门应用的详细步骤。Dubbo是一个高性能、轻...

    word源码java-fleet-spring-boot:SpringBoot教程,SpringBoot的各种简单示例,快速入门使用Sprin

    的各种简单示例,快速入门使用 Spring Boot 各种组件 示例项目 基础部分: :Spring Boot 快速入门 Hello world 示例 :Spring Boot 自定义 Banner (启动图案) :Spring Boot 主题切换 :Spring Boot 简单的服务...

    SpringRecipes

    《Spring Recipes》不仅适合初学者入门学习Spring框架,也适用于有一定经验的开发者进一步提升技能。书中丰富的示例和详尽的解释能够帮助读者快速理解和掌握Spring的关键技术和最佳实践。对于想要深入了解Spring并将...

    Spring Security3技术手册

    了解如何配置这些过滤器是入门Spring Security的关键。 - **示例代码**: 在`web.xml`中配置`&lt;filter&gt;`和`&lt;filter-mapping&gt;`,定义Spring Security的入口。 - **1.2 使用命名空间** - Spring Security支持在`...

    [Pro.Spring.3(2012)].Clarence.Ho.文字版

    本章是Spring框架的入门介绍,旨在为读者提供一个对Spring的基本理解。Spring框架是一个开源的Java平台,它提供了控制反转(Inversion of Control,IoC)容器、面向切面编程(Aspect-Oriented Programming,AOP)...

    spring-framework-5.0 中文文档PDF

    整体而言,Spring Framework 5.0中文文档PDF是一份全面的技术参考资料,它不仅介绍了Spring框架的各个方面,还提供了丰富的代码示例和使用场景,帮助开发者理解和掌握Spring的各种技术细节。对于希望深入学习Spring...

    Spring_Security3中文指南.pdf

    ### Spring Security 3.0 入门与核心概念详解 #### 一、Spring Security简介 Spring Security 是一款功能强大且高度可定制的应用安全框架,它为基于 Java 的应用程序提供了全面的安全服务。尤其对于那些采用 ...

    Spring In Action 2005

    - **Spring快速启动**:通过一个简单的示例来演示如何使用Spring框架进行应用开发,包括依赖注入的基本概念。 **第2章:Bean的装配** 深入探讨Spring框架中的依赖注入(DI)机制,讲解如何定义、配置和管理Spring...

    Apress.Pro.Spring.Integration

    第四章“企业级Spring”深入探讨了Spring框架在企业环境中的高级应用,包括事务管理、远程调用支持(如RMI和Web Services)以及与企业信息系统(如ERP和CRM)的集成。这一章节对于那些需要在复杂的企业环境中部署和...

    搞定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-...

    springJAR包

    总之,"springJAR包"是Spring框架的一个打包形式,包含所有必要的组件和示例,为开发者提供了一个快速入门和学习Spring的途径。通过理解和掌握Spring的各个模块,开发者可以构建出高效、灵活的企业级应用。

    spring 的权限管理框架 中文参考手册

    - **Transparent Authentication Context Propagation for Remote Method Invocation (RMI) and HttpInvoker**:Spring远程调用协议的一种透明身份验证上下文传播方式。 - **Automatic "Remember-Me" Authentication...

    搞定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-...

    搞定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-...

    Spring.in.Action.2nd.Edition.Aug.2007.pdf

    综上所述,《Spring in Action》第二版是一本非常适合初学者入门Spring框架的书籍,无论是在理论知识还是实际应用方面都有非常详尽的介绍。对于想要深入了解Spring框架及其应用场景的开发者来说,本书是一个不可或缺...

    atmosphere-samples:大气样本

    您可以通过单击其名称来下载样本,或克隆工作区,构建它,然后执行 mvn jetty:run 或者 mvn tomcat7:run 推荐的入门示例是聊天,它演示了使用AtmosphereHandler或jquery-pubsub进行的所有传输的用法,它们演示

Global site tag (gtag.js) - Google Analytics