发表于: 2017-11-15 22:40:31
1 813
一.今日完成
整理任务8深度思考
1.什么是rmi?为什么要使用rmi框架?
RMI是J2EE技术规范之一,英文全称Remote Method Invocation(即远程方法调用)。远程方法调用是一种同一计算机不同Java研发软件系统之间或不同计算机不同Java研发软件系统之间通过调用对方远程方法启动对方进程进而实现交互的一种机制,这种机制为开发Java分布式应用程序带来了极大的方便。
RMI技术的应用通常包括在两个独立的应用程序中:RMI服务端应用程序和RMI客户端应用程序。
1.1JAVA RMI远程方法调用技术
(1)RMI服务端应用程序:
RMI典型的服务端代码将创建多个由远程接口实现类创建的远程对象,使这些远程对象能够被引用,然后等待客户端调用这些远程对象内已实现的远程接口中的方法,其实现步骤如下:
1)自定义远程接口
在 Java RMI服务端远程对象是自定义远程接口实现类的实例, 该自定义远程接口声明每个要远程调用的抽象方法。 该接口特点:
a、该接口必须继承java.rmi.Remote接口;
b、该接口中的每个抽象方法必须抛出RemoteException异常或RemoteException 的父类异常;
2)远程接口实现类
a、该实现类必须实现自定义远程接口内的每个远程抽象方法;
b、该实现类必须继承java.rmi.UnicastRemoteObject类。UnicastRemoteObject类可以让服务端远程对象与客户端建立一对一的连接;
c、由于UnicastRemoteObject类中默认构造方法抛出RemoteException异常,因此该实现类中默认的构造方法必须显示地写出来并且该构造方法必须声明抛出RemoteException异常,别忘了子类构造方法要与参数列表相同的父类构造方法一致,父类无参构造方法抛出了RemoteException异常,那么子类无参构造方法也需要抛出RemoteException异常;
d、该实现类也可以含有其它非远程接口定义的抽象方法或非接口方法(即实现类内部自定义的方法,这些方法不能使用@Override进行注释),但客户端不能调用这些新增的方法。
3)服务端RMI启动类
a、通过java.rmi.registry.LocateRegistry类的createRegistry 方法为RMI服务端远程对象注册表设置端口号;
b、通过Naming类的bind方法将serviceName(即服务名称)和远程接口类型的变量或远程接口实现类类型的变量绑定,为RMI客户端获取该服务名称对应的远程对象引用奠定基础,其中第一个参数的标准格式为“rmi://host:registryPort/serviceName”也可以“//host:registryPort/serviceName”。注意:这里是远程接口类型的变量与服务名绑定.
(2)RMI客户端应用程序:
RMI典型的客户端程序从RMI服务端中得到一个或多个远程对象引用,然后调用远程对象内具体实现的自定义远程接口中的抽象方法。
1)自定义与RMI服务端自定义远程接口名称相同的接口
a、该接口的接口名必须和RMI服务端自定义远程接口名称相同;
b、该接口无须继承java.rmi.Remote接口;
c、该接口中需要通过RMI服务端远程对象调用的接口抽象方法需要和RMI服务端一样(这里的“一样”是指接口名、方法名、参数列表和方法返回值类型一样);
d、该接口中的抽象方法无须抛出RemoteException异常;
e、该接口可以包含RMI服务端自定义远程接口内不存在的抽象方法;
f、该接口无须包含RMI服务端自定义远程接口的所有抽象方法;
g、该接口完全可以直接复制RMI服务端自定义远程接口,但从代码精简的角度讲还是能删则删比较好。
2)如何运行RMI?
a、先运行RMI服务器端,比如上面RMI服务端中的StartRMIServer类;
b、运行RMI客户端,比如上面RMI客户端中的TestClient类;
1.2在Spring框架中使用RMI技术
(1)RMI服务端应用程序
1)自定义远程接口
该接口特点:
a、该接口没有继承java.rmi.Remote接口;
b、该接口中的每个抽象方法没有抛出RemoteException异常或RemoteException 的父类异常;
2) 自定义远程接口实现类
该实现类特点:
a、该实现类必须实现自定义远程接口内的每个远程抽象方法;
b、该实现类没有继承java.rmi.UnicastRemoteObject类,这与JAVA RMI远程方法调用技术中的自定义远程接口实现类不同的地方;
c、该实现类中默认的构造方法没有显示地写出来,该默认构造方法更没有声明抛出RemoteException异常,这与JAVA RMI远程方法调用技术中的自定义远程接口实现类不同的地方;
d、该实现类也可以含有其它非远程接口定义的抽象方法或非接口方法(即实现类内部自定义的方法,这些方法不能使用@Override进行注释),但客户端不能调用这些新增的方法。
3)在xml文件中配置RMI服务端
该xml文件的配置就相当于JAVA RMI远程方法调用技术中服务端RMI启动类内被try-catch包裹的那段Java代码。
4)启动RMI服务端
将RMI服务端配置到Spring框架内后,启动它是很简单的——只需Java加载配置文件上下文,在Spring容器生成相应的bean即可。
(2)RMI客户端应用程序
1)自定义包含了RMI服务端自定义远程接口内某些抽象方法的RMI客户端接口
该接口特点:
a、该接口的接口名无需和RMI服务端自定义远程接口名称相同;
b、该接口无须继承java.rmi.Remote接口;
c、该接口中需要通过RMI服务端远程对象调用的接口抽象方法需要和RMI服务端一样(这里的“一样”是指接口名、方法名和参数列表一样,注意:这里没有提及方法返回值类型,实验证明,返回值类型可以相同也可以是RMI服务端自定义远程接口相应抽象方法返回值类型的父类,例如该接口中的返回值类型完全可以改为Object,这一点与Java RMI远程方法调用技术中的要求不一样——它要求返回值类型必须一致);
d、该接口中的抽象方法无须抛出RemoteException异常;
e、该接口可以包含RMI服务端自定义远程接口内不存在的抽象方法;
f、该接口无须包含RMI服务端自定义远程接口的所有抽象方法;
g、该接口完全可以直接复制RMI服务端自定义远程接口,但从代码精简的角度讲还是只保留需要的抽象接口为好。
2)在xml文件中配置RMI服务端
该xml文件的配置就相当于JAVA RMI远程方法调用技术中客户端RMI调用远程方法测试类内try-catch段Java代码。
3)启动RMI客户端
2.什么是SCA?什么是分布式?分布式有什么优点?
2.1 SCA
SCA是一个致力于为服务构件以及连接各服务构件的访问方式而包容各种广泛的技术模型。对于构件,不仅仅只是不同的编程语言,还包括那些编程语言普遍使用的框架和环境。对于访问方式,SCA组合允许使用广泛采用的各种通讯和服务访问技术。其中包括如Web service、Messaging 系统以及远程过程调用(RPC)技术等。
SCA规范中文版参见:https://cwiki.apache.org//confluence/pages/viewpage.action?pageId=96720
2.2 分布式
分布式概念的引入是基于性能的提升,应用的可靠性而提出的。所谓Java分布式,即是在使用Java语言进行企业级应用开发的过程中,采用分布式技术解决业务逻辑的高并发、高可用性的一些架构设计方案。
在分布式系统中,一个完整的中间件需要展现一定的对于上层程序语言的以及底层的物理设施的抽象性。而分布式对象和分布式组件恰恰是2种重要的实现方式。
1、分布式对象包集成了面向对象的语言的特征和优点。能够使用户用类似面向对象的语言调用的层次上去实现远程的方法调用。
2、分布式对象有下面的一些优点:1)包装性2)他将一个对象的实现和对象本身分离了3)具有动态性和扩展性。
3、分布式组件是为了克服分布式对象的一些缺点而发展而来的,解决了在分布式系统中出现的下面的一些问题:1)不完全的独立性,接口的描述信息过少2)程序的复杂性3)应用开发者缺少对分布式的完全具体的掌控,不能处理一些比如安全,传输等等方面4)分布式对象不支持部署。而统统的这些,可以在分布式组件中被逐一的解决。
3.为什么要把web和service分离?应用了哪些概念?
将web和service分离符合分布式架构的思想,.降低了组件的耦合度,便于模块式开发.
二.明日计划
1.学习Apache Tuscany的官方手册,配置Tuscany和Spring做一个小demo
2.将原有的Spring RMI更改为Tuscany的RMI
三.遇到问题
任务8的代码虽然是要求实现RMI,分离web和service;但是由于之前任务完成的掌握情况较差,尤其是JSP和第三方API调用测试,所以参照张鑫师兄的日报和代码把任务8代码整理出来,但是很多功能实现不了,对一些实现类的调用配置也不大明白.由于现在学习时长所剩不多,所以赶紧进入复盘,这些问题留待以后慢慢解决.
四.收获
以上.
进度:现在任务进度滞后严重,同组复盘的道友已经开始着手大量工作;所以计划先把任务8和9知识点过一遍,至于跑通调试以后再说.
评论