发表于: 2017-10-16 22:53:22
1 820
今天完成的事情:调制这个rmi 调试了两天的功夫 终于调试成功了
调试本地的比较容易
传到服务器上 调试比较麻烦 主要是不知道错误在哪里
更改了很多地方 有些事需要注意的
首先来说我们的配置文件 要没问题 连接数据库也没问题 因为从本地改成了服务器
这里我参考师兄的日报 主函数里面最下面加了这个
Object lock = new Object();
synchronized (lock) {
lock.wait();
}
这段代码 是线程加锁 是我原来没有的 不过经过测试实际问题跟这里无关
尝试了启用关闭本地windows防火墙 经过测试与实际问题无关
修改了一波mysql设置 经过测试与实际问题(我的)无关
这个是看默认的链接等待时间 默认为8小时 我们可以改成一年
这个应该是使用线程池的话可能会遇到的问题 我这里没有使用池
再看一下配置文件 这里很重要
<!-- 将一个类发布为一个RMI服务 -->
<bean id="myRMIServer" class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="LoginService"></property>
<property name="service" ref="loginServiceImpl"></property>
<property name="serviceInterface" value="com.jnshu.service.LoginService"></property>
<property name="registryPort" value="9999"></property>
<property name="servicePort" value="8181" />
看一下这里我们门应该指定两个端口 注册端口 和服务端口(用来数据传输)
这个端口是可以与注册端口重复的 这里我们把它改成8181(原来也写的9999) 直观一点 后台运行后
netstat -apnl
而且注意到 9999 8181 他们的pid一致 当然这样程序运行也是正常的
如果这里不对这个服务端口 指定会怎么样呢 我注释掉
然后去运行这个jar
果然 你不指定他就会随机指定 39897
这次客户端运行程序有问题了 错误代码必须全粘上
Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.remoting.RemoteConnectFailureException: Could not connect to remote service [rmi://47.94.23.47:9999/LoginService]; nested exception is java.rmi.ConnectException: Connection refused to host: 47.94.23.47; nested exception is: java.net.ConnectException: Connection timed out: connect org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
Root Cause
org.springframework.remoting.RemoteConnectFailureException: Could not connect to remote service [rmi://47.94.23.47:9999/LoginService]; nested exception is java.rmi.ConnectException: Connection refused to host: 47.94.23.47; nested exception is: java.net.ConnectException: Connection timed out: connect org.springframework.remoting.rmi.RmiClientInterceptorUtils.convertRmiAccessException(RmiClientInterceptorUtils.java:150)
最底层
Root Cause
java.net.ConnectException: Connection timed out: connect java.net.DualStackPlainSocketImpl.connect0(Native Method) java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) java.net.Socket.connect(Socket.java:589) java.net.Socket.connect(Socket.java:538) java.net.Socket.<init>(Socket.java:434) java.net.Socket.<init>(Socket.java:211) sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227) java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179) com.sun.proxy.$Proxy17.invoke(Unknown Source) org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:399) org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:345) org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:260) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) com.sun.proxy.$Proxy18.checkUserPassword(Unknown Source) com.jnshu.controller.UserController.doLogin(UserController.java:142) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
这里去调用数据库了 数据传输就失败了
然后我去吧这个随机端口给他开开 (阿里云必须配置安全组开端口) 39897
果然程序运行正常了
明天计划的事情:讲小课堂 加紧完成任务九
遇到的问题:各种错误 什么连接超时
链接被拒绝
百度了很多 虽然大部分没有用 但还是找到了一些有用的知识点
遇到错误先要定位错误 只有知道错误的原理才能解决
一是从日志里面寻找 哪怕是运行jar包也应该能够 打出日志 根据日志定位错误代码或者原因
二是从原理上分析 这里主要是rmi的原理 理解的不足 导致花了很长时间找不出问题
三是从底层一点点往上推 多用程序来验证
具体来说一下
ava.rmi.ConnectException: Connection refused to host: ; nested exception is:
java.net.ConnectException: Connection refused (Connection refused)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338)
at sun.rmi.registry.RegistryImpl_Stub.list(RegistryImpl_Stub.java:85)
at org.springframework.remoting.rmi.RmiServiceExporter.testRegistry(RmiServiceExporter.java:421)
at org.springframework.remoting.rmi.RmiServiceExporter.getRegistry(RmiServiceExporter.java:400)
at org.springframework.remoting.rmi.RmiServiceExporter.getRegistry(RmiServiceExporter.java:378)
at org.springframework.remoting.rmi.RmiServiceExporter.getRegistry(RmiServiceExporter.java:337)
at org.springframework.remoting.rmi.RmiServiceExporter.prepare(RmiServiceExporter.java:268)
at org.springframework.remoting.rmi.RmiServiceExporter.afterPropertiesSet(RmiServiceExporter.java:230)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.jnshu.RMIServiceTest.main(RMIServiceTest.java:12)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 24 more
[INFO ] 2017-10-17 08:53:00,589 method:org.springframework.remoting.rmi.RmiServiceExporter.getRegistry(RmiServiceExporter.java:405)
Could not detect RMI registry - creating new one
[DEBUG] 2017-10-17 08:53:00,702 method:org.springframework.remoting.rmi.RmiBasedExporter.getObjectToExport(RmiBasedExporter.java:59)
RMI service [com.jnshu.serviceImpl.LoginServiceImpl@4d5d943d] is an RMI invoker
[DEBUG] 2017-10-17 08:53:00,713 method:org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:117)
Creating JDK dynamic proxy: target source is SingletonTargetSource for target object [com.jnshu.serviceImpl.LoginServiceImpl@4d5d943d]
[INFO ] 2017-10-17 08:53:00,720 method:org.springframework.remoting.rmi.RmiServiceExporter.prepare(RmiServiceExporter.java:277)
Binding service 'LoginService' to RMI registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[47.94.23.47:9999](local),objID:[0:0:0, 0]]]]
这个是运行jar 包 爆出的异常代码还是全部复制上把 好分析
这里已经是在jar文件的主函数里面 指定了hostname
System.setProperty("java.rmi.server.hostname","47.94.23.47");
然而报错连接拒绝
但是注意后面 就是上面代码的最后一行
Binding service 'LoginService' to RMI registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[47.94.23.47:9999](local),objID:[0:0:0, 0]]]]
成功吧rmi注册绑定到了 我们设置的ip 端口上
所以这里我们忽略掉她 client是完全正常使用的
实际上这里是我在开始忽视了异常等级 我用的debug 而这个报错级别低
但是这个异常是怎么回事呢 看一下这段异常是在执行哪里的时候出现的
[DEBUG] 2017-10-17 08:53:00,541 method:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1595)
Invoking afterPropertiesSet() on bean with name 'myRMIServer'
[INFO ] 2017-10-17 08:53:00,542 method:org.springframework.remoting.rmi.RmiServiceExporter.getRegistry(RmiServiceExporter.java:394)
Looking for RMI registry at port '9999'
[DEBUG] 2017-10-17 08:53:00,582 method:org.springframework.remoting.rmi.RmiServiceExporter.getRegistry(RmiServiceExporter.java:404)
RMI registry access threw exception
java.rmi.ConnectException: Connection refused to host: ; nested exception is:
可以看到Spring封装地rmi 他是先看rmi 是否注册了 所以这里这个host必然拒绝链接
然后他才去注册的我们指定的IP端口 我大致是这样理解的
收获:总结了一下经验 不怕出问题 就怕不知道问题是什么
写程序一定要认真细心 有些地方最好复制粘贴 以免自己前后写的不匹配
我把服务器的外网ip打错了你敢信
很多原先学会的东西 缺少复习都记忆的不清楚了 需要复习
评论