发表于: 2017-04-20 23:54:20
4 1497
今天完成的事情:
一.部署两台Service,在WEB中随机访问任意一台Service。
部署两台 service 的方式:
重新建一个model,和上一个service大致一样。
把两个service都注入到controller里面
double v = 2 * Math.random();
int flat = v < 1 ? 1 : 2;
List<Student> studentList = null;
if(flat == 1){
try {
studentList = studentService.findAllStudent();
System.out.println("service 访问");
} catch (Exception e) {
//e.printStackTrace();
//System.out.println("service 异常");
try {
studentList = studentService2.findAllStudent();
System.out.println("service 异常,service2 访问");
} catch (Exception e1) {
//e1.printStackTrace();
System.out.println("service 和service2 异常");
}
}
}else {
try {
studentList = studentService2.findAllStudent();
System.out.println("service2 访问");
} catch (Exception e) {
//e.printStackTrace();
//System.out.println("service2 异常");
try {
studentList = studentService.findAllStudent();
System.out.println("service2 异常 service 访问");
} catch (Exception e1) {
//e1.printStackTrace();
System.out.println("service2 和 service 异常");
}
}
}
model.addAttribute("studentList", studentList);
return "student";
}
我是用的这种蠢方法实验的,如果service多的话,try catch 可能会受不了。
这儿就出现问题了:当把停掉的service重新启动,却不能访问!!!
当然,我也是参考师兄的日报才发现问题,原因是注入的service实例会在容器启动之后就一直是这个实例,重启并不能产生新的实例,只有已经注入好的实例。
解决 :(部分代码)标黄的地方是发生改动的地方
context = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
double v = 2 * Math.random();
int flat = v < 1 ? 1 : 2;
List<Student> studentList = null;
if(flat == 1){
try {
StudentService studentService = (StudentService) context.getBean("studentService");
studentList = studentService.findAllStudent();
System.out.println("service 访问");
} catch (Exception e) {
//e.printStackTrace();
//System.out.println("service 异常");
try {
StudentService studentService2 = (StudentService) context.getBean("studentService2");
studentList = studentService2.findAllStudent();
System.out.println("service 异常,service2 访问");
} catch (Exception e1) {
//e1.printStackTrace();
System.out.println("service 和service2 异常");
}
}
}else {
结果:重启服务端之后可以重新访问。
二.部署两台WEB,通过Nginx配置两台WEB随机访问,两台WEB可以随机访问两台Service。
这个花费了很长时间:
1.第一次我直接把 task8-controller 的war 包发布到虚拟机上,然后访问,出现的错误是:
: Connection refused to host
因为:rmi的地址
<bean id="studentService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:8011/StudentService"/>
<property name="serviceInterface" value="org.xiuzhenyuan.service.StudentService"/>
<!--setting refresh connect-->
<!--<property name="refreshStubOnConnectFailure" value="true"/>-->
</bean>
2.尝试了很多的东西,修改本地的host,不管用。
网上有这种方法:
我试了,启动都不行。
3.最后:
修改修改虚拟机的host文件:不知道这样改对不对,总之是远程的web 可以调用本地的service了。
三。配置nginx
说多了都是泪,每配置一次,都会刷新一次认知。
先上结果:
访问的是远程:
访问的是本地:
可以看到,访问的地址都是localhost开头。
nginx.conf(按照我的认识:url应该是 http://xiuzhenyuan/)但是却是报错404
小马交给我要配置本地host文件,然而并不管用。
2017/4/21
补充:关于rmi服务端重启后,不能使用。(前一个方法也是一种思路,这个比较简便。)
在rmi的客户端配置文件修改为:
<bean id="studentService2" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:8013/StudentService"/>
<property name="serviceInterface" value="org.xiuzhenyuan.service.StudentService"/>
<!--setting refresh connect-->
<property name="refreshStubOnConnectFailure" value="true"/>
</bean>
setting refresh ,加上这个即可。一开始搜到的文档说要设置延迟还有rmiScoketFactory,感觉有点复杂,没法下手。今天又搜索了一次,发现有个说直接加这个就可以,我试了一遍,可以!
文章:http://stackoverflow.com/questions/1477121/reconnect-rmi-client-after-server-restart
stackoverflow上好多解决问题的帖子,只是英语有点伤。
明天计划的事情:
1.开始任务九,终于到这儿了。
遇到的问题:
1.虽然说远程的controller可以访问本地的service了,但是没有数据不知道是什么鬼。
收获:
关于网络方面的知识真心差,好多不懂得,知道了差距,就要努力。
评论