今天完成的事情:
今天主要是对任务八进行最后的收尾。
关于任务八,最难想到的,应该是如何在项目运行中实现随机转换服务端。
昨晚个东林和牛涛师兄好好想了想,最后用读取配置文件的方式实现服务转换。
理由是,
项目创建bean的方式有两种,
一种是在最开始的时候自动加载。第二种是手动在项目中加载配置文件。
第一种不好控制,只好使用第二种。
相关代码如下:
首先是在服务器端设置好需要的客户端bean,注册到注册表中心。
然后在客户端设置客户端需要的bean,因为涉及到加载配置文件,所以先将两个bean独立出一个文件夹。然后Spring容器都是在最开始就加载好的,这样子在程序启动的时候就会报异常,所以对对应的bean启动懒加载,这样,只有在需要的时候才会加载对应的bean。
<!-- 客户端 -->
<bean id="StudentService1" lazy-init="true" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="com.jnshu.services.StudentsService"/>
</bean>
<!-- 客户端 -->
<bean id="StudentService2" lazy-init="true" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceInterface" value="com.jnshu.services.StudentsService"/>
</bean>
然后在控制器进行加载:
try {
ctx = new ClassPathXmlApplicationContext("com/jnshu/services/Client.xml");
studentsService = (StudentsService) ctx.getBean("StudentService1");
logger.info("随机数为一,获取服务一!");
} catch (Exception e) {
ctx = new ClassPathXmlApplicationContext("com/jnshu/services/Client.xml");
studentsService = (StudentsService) ctx.getBean("StudentService2");
logger.info("随机数为一,获取服务一失败,转获取服务二");
}
这样基本上实现了在程序启动的时候,去加载对应的bean。但是这里就有一个问题,加载好bean后就不会再进行替换,所以这样只是实现了第一步的,在启动的时候去获取到bean,获取失败才会换bean。
那么。如何设置随机获取,实现流转自如呢?
后来想到的办法是用随机数来是实现。但是bean只有两个,虽然可能有多个,但是怎样获取随机数?
代码如下:
i = (int) (Math.random() * 2 + 1);
首先,用Math.random()函数去获取到随机数。基本概念如下:
1. int num=(int)(Math.random()*n); //返回大于等于0小于n之间的随机数
2. int num0=m+(int)(Matn.randon()*n); //返回大于等于m小于m+n(不包括m+n)之间的随机数
那么获取到随机数之后如何使用?
if (i == 1) {
try {
ctx = new ClassPathXmlApplicationContext("com/jnshu/services/Client.xml");
studentsService = (StudentsService) ctx.getBean("StudentService1");
logger.info("随机数为一,获取服务一!");
} catch (Exception e) {
ctx = new ClassPathXmlApplicationContext("com/jnshu/services/Client.xml");
studentsService = (StudentsService) ctx.getBean("StudentService2");
logger.info("随机数为一,获取服务一失败,转获取服务二");
}
} else {
try {
ctx = new ClassPathXmlApplicationContext("com/jnshu/services/Client.xml");
studentsService = (StudentsService) ctx.getBean("StudentService2");
logger.info("随机数为二,获取服务二!");
} catch (Exception e) {
ctx = new ClassPathXmlApplicationContext("com/jnshu/services/Client.xml");
studentsService = (StudentsService) ctx.getBean("StudentService1");
logger.info("随机数为二,获取服务二失败,转获取服务一");
}
}
但是这里有一个问题,代码里有一些东西其实是重复的。但是重构还没想到法子,只好先放下。
基本完成以后,在服务器的运行如下:
明天计划的事情:完成任务九。
遇到的问题:
1.客户端只能实现在最开始的时候随机获取。解决方案:修改逻辑。
2.日志打印在停止一个web项目之后就不再打印,而另一个web其实还在运行。
错误原因:两个web在一个日志文件里面打印日志。
解决方案:将两个项目的日志分开打印。
3.1两个客户端一直在获取同一个服务端,而无法使用另一个服务端。
3.2两个客户端在启动的时候获取的是同一个服务端,而没有使用另一个服务端。
前面一个是服务端启动异常,重新启动服务端问题解决。
后面一个是客户端逻辑错误,修改随机逻辑,问题解决。
收获:
1.提交任务前,一定要准备好实际能够运行的项目。
2.日志打印一定要清晰,准确,有效。
3.编写项目逻辑的时候,一定要考虑逻辑实际运行的效果。
进度:
任务开始时间:2018年04月03日
预计demo时间:2018年04月07日
评论