发表于: 2017-12-01 23:17:03
1 697
今日完成的事情:
今日进行任务八,昨天做了一个小的demo,大概知道了rmi是怎么使用的,今天首先把昨天的小demo,集成到spring框架中,然后再把任务二的内容进行service和web端的分离。
首先还是服务端:
接口:
public interface HelloRMIService {
public int getAdd(int a, int b);
}
一个普通接口。
public class HelloRMIServiceImpl implements HelloRMIService {
@Override
public int getAdd(int a, int b) {
return a+b;
}
}
接口的普通实现。
然后就是配置到spring里面:
<bean id="helloRMIServiceImpl" class="com.mmy.serviceImpl.HelloRMIServiceImpl"> </bean>
<!-- 将一个类发布为一个RMI服务 -->
<bean id="myRMIServer1" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceInterface" value="com.mmy.service.HelloRMIService"/>
<property name="service" ref="helloRMIServiceImpl"/>
<property name="registryPort" value="5678"/>
<property name="serviceName" value="helloRMI"/>
</bean>
然后写了一个main方法,启动服务端:
public static void main(String[] args) {
new ClassPathXmlApplicationContext("Spring.xml");
System.out.println("service binding success");
}
运行结果:
绑定成功。
然后是客户端:
首先还是写一个和服务端一样的接口:
public interface HelloRMIService {
public int getAdd(int a, int b);
}
spring配置文件:
<bean id="myRMIClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="com.mmy.service.HelloRMIService"/>
<property name="serviceUrl" value="rmi://127.0.0.1:5678/helloRMI"/>
</bean>
用来查找绑定在helloRMI上面的对象。
main方法和运行结果:
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
HelloRMIService rmiUserService = (HelloRMIService) applicationContext.getBean("myRMIClient");
System.out.println(rmiUserService.getAdd(55,66));
}
运行成功。
然后有了思路之后就好办了。
用的任务二的内容进行改造:
服务端的项目可以删除controller,删除webapp下所有文件,删除spring mvc的配置文件,通过service层的接口提供相应的方法。
spring配置文件,用来把对象绑定到设置的响应名字和端口:
<bean id="userServiceImpl" class="com.mmy.serviceImpl.UserServiceImpl"/>
<bean id="myRMIServer" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="service" ref="userServiceImpl"/>
<property name="serviceInterface" value="com.mmy.service.UserService"/>
<property name="registryPort" value="1234"/>
<property name="serviceName" value="userServiceImpl"/>
</bean>
进行到这里的时候我犯了一个错误。我把服务端的程序用shade程序进行了打包,然后通过maven本地导入到客户端,然后测试连接服务端的时候测试通过了,但是启动tomcat的时候是报错。
我的推测是:
因为服务端是spring框架,有一些spring的jar包,打包的时候依赖关系一并打包。而客户端也有许多的spring的jar包,这样就造成了依赖关系的重叠,造成报错。
最后还是老办法,客户端写了一个接口,由于接口里面有model对象的调用,最后又写了一个model对象:
接口:
public interface UserService {
public List<User> queryAllUser();
public User queryUserById(Integer id);
public boolean update(User user);
public boolean add(User user);
public boolean delete(Integer id);
model是User对象,在这里就不贴了。
最后写了一个方法,用来调用UserService:
public UserService getUserService(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring.xml");
UserService rmiUserService = (UserService) applicationContext.getBean("myRMIClient1");
return rmiUserService;
}
最后顺利运行了程序:
实现了service和web的分离。
在这里我有个疑问:
虽然是成功了,但是在客户端又重新写了一遍model,有点不太符合代码复用的原则。
针对任务七的一点修改:
我的账号是:17186387659
密码是:123456
登陆进去是:
绑定邮箱再个人信息了面。
我是用的荣联的短信,sendcloud的邮箱,目前是测试用,所以只能给我设置好的手机号和邮箱发验证码。
师兄等你到修真院,我可以当面给你演示。
明日计划的事情:
明日继续进行任务八,部署两台service实现随机访问。
遇到的问题:
部署两台service,目前想的方案是:
1)要把原来的serviece重新copy一份,更改绑定的端口号。这种方法,会造成大量的代码重复,等于就是完全重复。
2)在一个service的spring配置文件里面配置不同的端口绑定。这种方法,要是service挂了的情况下,等于说是两个绑定的端口都挂了,因为都是在一个程序里面。
收获:
用spring rmi实现了service和web的分离。
任务开始时间:2017/12/1
预计完成时间:2017/12/6
延期:无
禅道:http://task.ptteng.com/zentao/my-task.html
评论