- 浏览: 224498 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
kandari:
很全,收藏
oracle相关知识 -
若见三生石:
,辛苦楼主!感谢为大伙敏捷开发做出贡献!
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
若见三生石:
你好,要定义的类和类型怎么写呢?
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
greatwqs:
...
PLSQL操作文件 -
sun17921:
var areaCode ={11:"北京" ...
身份证验证JS
一个正常工作的RMI系统由下面几个部分组成:
● 远程服务的接口定义
● 远程服务接口的具体实现
● 桩(Stub)和框架(Skeleton)文件
● 一个运行远程服务的服务器
● 一个RMI命名服务,它允许客户端去发现这个远程服务
● 类文件的提供者(一个HTTP或者FTP服务器)
● 一个需要这个远程服务的客户端程序
1、远程服务的接口定义
RMI对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。
创建一个远程接口时,必须遵守下列规则:
1)、远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。、
2)、远程接口必须扩展接口java.rmi.Remote。
3)、除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.
4)、作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能:
//Calculator.java //define the interface import java.rmi.Remote; public interface Calculator extends Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; }
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
2、远程服务接口的具体实现
第二步,对远程服务接口的具体实现,这是一个CalculatorImpl类文件:
//CalculatorImpl.java //Implementation import java.rmi.server.UnicastRemoteObject public class CalculatorImpl extends UnicastRemoteObject implements Calculator { public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; } public long sub(long a, long b) throws java.rmi.RemoteException { return a - b; } public long mul(long a, long b) throws java.rmi.RemoteException { return a * b; } public long div(long a, long b) throws java.rmi.RemoteException { return a / b; } }
这个实现类使用了UnicastRemoteObject去联接RMI系统。在这个例子中,是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。
如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。
3、桩(Stubs)和框架(Skeletons)
接下来就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
>rmic CalculatorImpl
在相关目录下运行上面的命令,成功执行完上面的命令将会发现一个Calculator_stub.class文件,如果使用的Java2SDK,那么还可以发现Calculator_Skel.class文件。
4、主机服务器
远程RMI服务必须是在一个服务器中运行的。下面定义的CalculatorServer类是一个非常简单的服务器。
//CalculatorServer.java import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("rmi://localhost:1099/CalculatorService", c); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); } }
5、客户端
客户端源代码如下:
//CalculatorClient.java import java.rmi.Naming; import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.NotBoundException; public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator) Naming.lookup( "rmi://localhost /CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); } catch (MalformedURLException murle) { System.out.println(); System.out.println( "MalformedURLException"); System.out.println(murle); } catch (RemoteException re) { System.out.println(); System.out.println( "RemoteException"); System.out.println(re); } catch (NotBoundException nbe) { System.out.println(); System.out.println( "NotBoundException"); System.out.println(nbe); } catch ( java.lang.ArithmeticException ae) {System.out.println(); System.out.println( "java.lang.ArithmeticException"); System.out.println(ae); } } }
6、 运行RMI系统
上面建立了所有运行这个简单RMI系统所需的文件,现在可以运行这个RMI系统了,由于是在命令控制台下运行这个系统的,所以必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。
1、首先运行注册程序RMIRegistry:
>rmiregistry
2、在第二个控制台里,运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以必须增加一条安全策略。以下是对应安全策略的例子
grant {
permission java.security.AllPermission "", "";
};
注意:这是一条最简单的安全策略,它允许任何人做任何事,对于更加关键性的应用,你必须指定更加详细安全策略。
现在为了运行服务端,需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。
> java -Djava.security.policy=policy.txt CalculatorServer
这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。
3、现在切换到第三个控制台,启动客户端。
为了在其他的机器运行客户端程序需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端
prompt> java -Djava.security.policy=policy.txt CalculatorClient
结束语
RMI为真正面向对象的分布式计算提供了可靠的平台。 您可使用RMI连接到Java组件,或用其它语言编写的现有 的组件。随着Java在您的环境中所具备的重要性的日益 增加,您还可扩大Java的使用范围,并获得所有的好处 --无需移植、低维护成本和安全而保密的环境。RMI为您 提供了循序渐进地将Java扩展到您的系统所有部分的平 台,您可根据需要适时地添加Java服务器和客户机。只 要您添加了Java,那么它所有的好处都会随之而来。RMI 则使之更简单、保密和强大
spring实现RMI例子:
1、定义的接口
public interface UserManager { public void setUserDao(UserDao dao);; public AppUser getUser(String username);; public List getUsers(AppUser user);; public void saveUser(AppUser user); throws UserExistsException; public void removeUser(String username);; public String checkLoginCookie(String value);; public String createLoginCookie(String username);; public void removeLoginCookies(String username);; }
2、服务器端spring.xml配置:
<bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="demo.appfuse.service.impl.UserManagerImpl"> <property name="userDao" ref="userDao" /> </bean> </property> <!-- Override default transaction attributes b/c of LoginCookie methods --> <property name="transactionAttributes"> <props> <prop key="save*"> PROPAGATION_REQUIRED,-UserExistsException </prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*LoginCookie">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean class="org.springframework.remoting.rmi.RmiServiceExporter"> <property name="serviceName" value="userService"/> <property name="service" ref="userManager"/> <property name="serviceInterface" value="demo.appfuse.service.UserManager"/> <!-- defaults to 1099 --> <property name="registryPort" value="1199"/> </bean>
3、客户端spring xml配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="userService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceUrl" value="rmi://localhost:1199/userService"/> <property name="serviceInterface" value="demo.appfuse.service.UserManager"/> </bean> </beans>
4、客户端调用方式:
userManager = (UserManager) applicationContext.getBean("userService");
接下来调用userManager接口就可以了。
发表评论
-
Spring 框架的设计理念与设计模式分析
2011-07-20 16:23 859http://www.ibm.com/developerwor ... -
struts1.2和2.0
2011-07-14 13:33 864WebWork 2 : 与Struts的比较 Th ... -
Struts1和Struts2的区别
2009-12-30 16:13 784Action 类: ◆Struts1要求Action类继承 ... -
WebWork概述
2009-12-30 16:12 794WebWork是建立在称为XWork的Command模式框架之 ... -
IBATIS缓存
2009-12-23 17:56 821iBATIS可以在Mapped Statement ... -
IOC实现原理
2009-12-16 21:03 1590对Spring IOC的理解离不开 ... -
spring的AOP理论
2009-12-16 13:01 873AOP术语:http://kang.iteye.com/blo ... -
Hibernate悲观锁和乐观锁
2009-12-16 12:57 919锁 ( locking ) 业务逻辑的实现过程中,往 ... -
webService理论和XFire
2009-12-14 15:42 877http://in3040.blog.163.com/blog ... -
Hibernate理论
2009-12-13 15:14 838hibernate对JPA支持:http:// ... -
EJB理论3.0
2009-12-11 15:08 784在已经提交的EJB3.0规范 ... -
WebService实现包--AXIS2
2009-12-11 14:48 1551深度探索 Axis2:AXIOM: http://ww ... -
EJB理论
2009-12-11 14:36 8371、EJB与JAVA BEAN的区别 ... -
RMI理论
2009-12-11 11:06 798一、RMI系统运行机理 RMI应用程序通常包括两个 ... -
spring2.5中的@注释配置
2009-12-10 20:01 979下面这篇文章写得很更清晰 http://haowei0315 ... -
AOP总结(spring)
2009-12-10 14:32 962实现AOP流程: Service s = new Servi ... -
AOP的JDK and CGLib 动态代理 示例
2009-12-09 16:50 1015package com.proxy; public ... -
AOP例子(spring配置实现)
2009-12-07 13:13 1746此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没 ... -
AOP理论
2009-12-07 11:45 814原文地址:http://dev.csdn. ... -
AOP生成代码三种方式
2009-06-05 09:44 1103AOP生成代码有三种可能方式: (1)静态编译时期,源代码生 ...
相关推荐
在这个"Spring RMI小例子"中,我们将深入理解Spring如何简化RMI的使用,以及如何通过它实现跨网络的交互。 首先,RMI允许Java对象在不同的JVM之间进行通信,仿佛它们都在同一个进程中运行。Spring通过提供自动注册...
6. **源码分析**:在提供的压缩包文件`SpringRMI`中,可能包含了上述所有步骤的代码示例。通过阅读这些源码,你可以深入理解Spring RMI的工作原理,包括服务暴露、注册、代理创建等。 7. **工具使用**:在开发过程...
在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring框架来增强RMI的功能,使其更加灵活和易于管理。 首先,我们需要理解Spring框架在RMI中的角色。Spring提供了对RMI的高级抽象,通过其`org.springframework...
在这个简单的例子中,我们将深入理解Spring RMI的工作原理以及如何实现一个基本的Spring RMI应用。 首先,让我们了解RMI的基本概念。RMI允许Java对象在不同的JVM之间进行通信,仿佛它们都在同一台机器上。它通过...
Java Spring与RMI(Remote Method Invocation)的整合是企业级应用中常见的远程服务交互方式。Spring框架提供了对RMI的...通过学习和理解这些内容,你可以创建自己的Spring-RMI应用,实现不同节点间的分布式服务交互。
自己收集了一些跑得通的教程,并自己整理给出了,入门例子。包括:最原生的使用javac和rmic的例子;还有进一步的,使用IDM,用代码代理原生rmic...还有RMI和Spring整合的例子。 另外附有:例子说明 和 一些简单的教程。
2. **实现RMI服务**:创建一个实现上述接口的类,并将其配置为Spring Bean。 ```java @Service public class MyServiceImpl implements MyService { @Override public String doSomething(String input) { ...
1. **新建接口和实现类** - 创建一个普通的接口 `AccountService`: ```java public interface AccountService { String getAccount(String msg); } ``` - 实现类 `AccountServiceImpl`: ```java public...
Spring RMI(Remote Method ...总的来说,Spring RMI提供了一种简单且强大的方式来实现Java应用的分布式架构,通过它可以构建高度可扩展和解耦的系统。理解和掌握这一技术,对于提升你的Java和Spring开发能力至关重要。
- 配置远程接口和实现:确保接口和实现类都继承了适当的接口(如`java.rmi.Remote`)并抛出`java.rmi.RemoteException`。 - 编译远程接口和实现:使用`rmic`命令生成Stub和Skeleton类。 - 注册远程对象:在服务器端...
了解并掌握这些基本概念和操作,你就可以开始尝试"java RMI简单例子",逐步深入理解RMI的使用。在实践中,你可以创建一个简单的远程服务,例如一个远程计算器,体验RMI如何让不同JVM上的代码协同工作。这将有助于你...
RMI是Java开发分布式应用的重要工具,尤其是在企业级应用中,如Spring框架就充分利用了RMI进行服务间的交互。 **RMI基本概念** 1. **远程接口(Remote Interface)**:定义了可以在远程对象上调用的方法,这些接口...
在这个"一个可以运行的RMI例子"中,我们可以深入理解RMI的工作原理以及如何在实践中应用。 RMI的核心概念包括远程接口、远程对象和RMI注册表。首先,远程接口定义了可以在远程服务器上执行的方法,这些接口需要继承...
5. **部署和启动RMI应用**:创建好远程接口和实现后,需要在服务器端启动RMI注册表并注册远程对象。同时,客户端需要知道服务器的主机名和端口号,以及远程对象在注册表中的名字。 6. **异常处理**:由于网络通信的...
2. **实现远程接口**:服务器端需要提供一个实现了远程接口的类,并且该类需要继承`java.rmi.Remote`并处理可能抛出的`RemoteException`。 ```java public class UserServiceImpl extends UnicastRemoteObject ...
本实例将深入探讨Spring的远程调用功能,通过一个简单的例子来帮助理解其工作原理和实施步骤。 首先,我们要明确Spring远程调用(Remoting)的基本概念。远程调用是指应用程序的不同组件或服务之间,通过网络进行...
Spring 整合 EhCache 是一个常见的缓存...通过以上步骤,你可以在Spring应用中实现EhCache的简单整合,提高应用程序的性能和响应速度。在实际项目中,根据业务场景灵活运用和优化缓存策略,可以进一步提升系统效率。
2. **Chapter 2**:可能是关于Spring的环境搭建和基本概念的介绍,源代码可能包含简单的Hello World程序,演示了如何创建一个Spring项目,配置Spring环境,并执行一个基本的Spring应用。 3. **Chapter 7**:通常...
12.5.1. iBATIS 1.x和2.x的概览与区别 12.5.2. iBATIS SQL Maps 1.x 12.5.2.1. 创建SqlMap 12.5.2.2. 使用 SqlMapTemplate 和 SqlMapDaoSupport 12.5.3. iBATIS SQL Maps 2.x 12.5.3.1. 创建SqlMapClient 12.5.3.2....