发表于: 2017-10-16 22:53:22

1 821


今天完成的事情:调制这个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打错了你敢信

  很多原先学会的东西 缺少复习都记忆的不清楚了 需要复习

  


返回列表 返回列表
评论

    分享到