发表于: 2018-04-07 23:14:24

1 608


今天完成的事情:

今天主要是对任务八进行最后的收尾。


关于任务八,最难想到的,应该是如何在项目运行中实现随机转换服务端。

昨晚个东林和牛涛师兄好好想了想,最后用读取配置文件的方式实现服务转换。
理由是,
项目创建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"/>
    <property name="serviceUrl" value="rmi://localhost:1099/StudentsServiceImpl"/>
</bean>
<!-- 客户端 -->
<bean id="StudentService2" lazy-init="true" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
    <property name="serviceInterface" value="com.jnshu.services.StudentsService"/>
    <property name="serviceUrl" value="rmi://localhost:1098/StudentsServiceImpl"/>
</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日



返回列表 返回列表
评论

    分享到