发表于: 2017-07-17 15:02:15

2 1141


今天完成的:

Task8的任务1,任务2差了一点

收获:

1.父工程使用空maven模板,二级工程commonsmanager使用portlet模板,子工程均使用quickstart模板。

父工程和commonsmanager打包成pom,子工程jarweb工程war

注意上图这里的构造路径,它将决定子工程在idea中显示和父工程的同级目录还是下级目录。

随后在写代码的时候,快速添加依赖,可以直接右键add dependency,它导入的将是父工程pom中规定的依赖。

2.springRMI整合

注意服务端和客户端的service路径以及调用的pojo路径必须相同,否则客户端可能找不到类。

springRMI的客户端支持是通过一个RmiProxyFactoryBean的代理工厂实现的。服务端通过RmiServiceExporter实现的。对多个接口的映射应该在一个端口中,设置不同的serviceName以便区别。

服务端:

<bean id="studentService" class="com.jnshu.serviceImpl.StudentServiceImpl"/>
<bean id="service1" class="org.springframework.remoting.rmi.RmiServiceExporter">
   <property name="serviceName" value="studentService"/>
   <property name="service" ref="studentService"/>
   <property name="serviceInterface"
             value="com.jnshu.service.StudentService"/>
   <property name="registryPort" value="8080"/>
   <property name="servicePort" value="8088"/>
</bean>

<bean id="developerService" class="com.jnshu.serviceImpl.DeveloperServiceImpl"/>
<bean id="service2" class="org.springframework.remoting.rmi.RmiServiceExporter">
   <!-- 配置自定义serviceName-->
   <property name="serviceName" value="developerService"/>
   <!-- RMI服务,ref引用接口的实现类-->
   <property name="service" ref="developerService"/>
   <!-- RMI服务,声明接口-->
   <property name="serviceInterface"
             value="com.jnshu.service.DeveloperService"/>
   <property name="registryPort" value="8080"/>
   <property name="servicePort" value="8088"/>
</bean>

<bean id="loginService" class="com.jnshu.serviceImpl.LoginServiceImpl"/>
<bean id="service3" class="org.springframework.remoting.rmi.RmiServiceExporter">
   <!-- 配置自定义serviceName-->
   <property name="serviceName" value="loginService"/>
   <!-- RMI服务,ref引用接口的实现类-->
   <property name="service" ref="loginService"/>
   <!-- RMI服务,声明接口-->
   <property name="serviceInterface"
             value="com.jnshu.service.LoginService"/>
   <property name="registryPort" value="8080"/>
   <property name="servicePort" value="8088"/>
</bean>

客户端:

<!-- spring支持RMI的代理工厂类-->
<bean id="studentService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <!-- 指定url和接口-->
   <property name="serviceUrl" value="rmi://127.0.0.1:8080/studentService" />
   <property name="serviceInterface"
             value="com.jnshu.service.StudentService" />
</bean>
<bean id="developerService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <property name="serviceUrl" value="rmi://127.0.0.1:8080/developerService" />
   <property name="serviceInterface"
             value="com.jnshu.service.DeveloperService" />
</bean>

<bean id="loginService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <property name="serviceUrl" value="rmi://127.0.0.1:8080/loginService" />
   <property name="serviceInterface"
             value="com.jnshu.service.LoginService" />
</bean>

调用的时候直接从spring中拿接口的bean就行。

3.Show dapendencies显示依赖树,比如你引用的包1也可能依赖别的包2。如果你又添加了依赖包2,两者版本冲突,而在pom文件中不可能直接找得到。可以用于解决依赖版本不一致的情况,

遇到的问题:

1.遇到了一个问题,项目没拆分之前,有两个地方用到了redis的实现类,控制器和service。我想把redis也封进服务端的service里,再通过客户端的controller调用。启动服务报出异常发现了一个以上的bean,注入失败。一个bean是以前service层包扫描器扫描的redisUtil,另一个似乎是RMI注入进去的。两个bean冲突了。

后来研究了一下,spring容器允许一个类注册出两个bean实例,此时可以用@Qualifier表明使用的是哪个bean

感觉这个是设计的时候结构不合理。

redisservicecontroller部分耦合了。最好是将发送短信ip限制的代码写到service里而不是controller。但我写进去之后需要将requestresponse传进service里,但是不行,有异常。所以就先这么用吧。

2.非常头疼,本地可以远程调用,服务器上就不行,有一种说法是linux服务器的hosts中的127.0.0.1代表本机,而直接连服务器外网ip是连不到的,需要改hosts。暂时不好用。

明天的计划:

就剩下搭服务器了,完成Task8


返回列表 返回列表
评论

    分享到