发表于: 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



返回列表 返回列表
评论

    分享到