发表于: 2019-10-11 23:26:57
1 968
一、今天完成的事情:
主要完成
1.学习spring-rmi
spring-rmi的流程和java.rmi相似
在Spring整合Rmi中:
服务端使用了org.springframework.remoting.rmi.RmiServiceExporter
RmiServiceExporter把任何Spring管理的Bean输出成一个RMI服务。
通过把Bean包装在一个适配器类中工作。适配器类被绑定到RMI注册表中,并且将请求代理给服务类。
客户端使用了org.springframework.remoting.rmi.RmiProxyFactoryBean
客户端的核心是RmiProxyFactoryBean,包含serviceURL属性和serviceInterface属性。
通过JRMP访问服务。JRMP JRMP:java remote method protocol,Java特有的,基于流的协议。
一个demo
服务端:
rmi.xml文件
service本地实现,serviceName对外提供的名称对外提供的名称,registyPort开启端口
测试类
客户端:
rmi.xml文件
lookupStubOnStartup:预查找远程对象 默认为true
refreshStubOnConnectFailure:是否刷新远程调用缓存的stub
注意:如果上述两项不配置,当服务器未开启,客户端无法打包,会有拒绝连接异常。
测试类:
2.项目分离
把dao层和service层放在了sevice端
controller层放在了web端
二、明天计划的事情:
主要完成任务九
三、遇到的问题:
1. 服务端启动,客户端启动后,调用service失败!!!
进行debug,发现professionMapper没有进行实例化
然后服务端是通过main方法执行的,main方法里只得到了spring-rmi.xml的内容,而原来的spring-dao.xml文件并没有导入。
所以在执行的时候,Mapper没有进行实例化。
修改:把两个文件合并为一个文件即可。
四、收获:
1.把项目进行了web端和service端的分离。
2.spring整合和RMI的具体步骤:
编写一个demo,我们分为两部分,一部分是server端的代码,一部分是client端的代码,client端的代码主要是为了使用server端的代码。当然这个代码是非常简单的
第一步:就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能(还有实体类)
第二步:在spring配置文件里配置暴露接口的service的Bean,里面包括serviceName(服务名称,随便起一个记得住的就行),service(接口实现类),serviceInterface(接口),redistryRort(服务注册端口),servicePort(服务端口。默认值为0,表示在与服务通信时将使用匿名端口)
第三步:建立一个类,初始化spring配置类就可以启动服务端的service,同时可以自己设置hostService 在初始化spring配置类之前加入 System.setProperty("java.rmi.server.hostname","***.***.0.***");语句就行
第四步开始在spring配置连接远程服务的Bean工作域,包括serviceInterface(和上面一样,服务的接口一定要相同,路径也要一样),serviceUrl(连接服务端的URL路径,格式一般为:rmi://+服务端的IP+服务端的名字,列如rmi://127.0.0.1:10086/studentRMI)
第五步初始化spring的配置类,然后通过getBean调用客户端,初始化后就可以运行服务端的方法了
评论