Java —— RMI + Element 老是出现java.io.EofException 或java.rmi.UnmarshalException: Error unmarshaling retu

来源:互联网 发布:淘宝店怎么做链接地址 编辑:程序博客网 时间:2024/05/16 00:38

Controller 接口中部分代码:(trainRmiService 是发布到本地某个端口的RMI 服务)

Document doc = DocumentHelper.createDocument();/** 建立XML文档的根books */Element root_element = doc.addElement("data");LinkedHashMap<String, Object> result_map = null;result_map = trainRmiService.getTrainDetail(train_id, user_id);String data = trainRmiService.getSingleTrainXmlData(train_id, user_id ,root_element);

导致错误:

WARN 2017-11-02 17:09:57.790 533140425@qtp-1101231294-1 [RmiProxyFactoryBean:305] - Could not connect to RMI service [rmi://127.0.0.1:9099/trainRmiService] - retryingjava.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.net.SocketException: Software caused connection abort: socket write errorat sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:229)at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162)at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)at com.sun.proxy.$Proxy97.getSingleTrainXmlData(Unknown Source)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.remoting.rmi.RmiClientInterceptorUtils.invokeRemoteMethod(RmiClientInterceptorUtils.java:71)at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:364)at org.springframework.remoting.rmi.RmiClientInterceptor.refreshAndRetry(RmiClientInterceptor.java:331)at org.springframework.remoting.rmi.RmiClientInterceptor.handleRemoteConnectFailure(RmiClientInterceptor.java:307)at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:267)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)at com.sun.proxy.$Proxy47.getSingleTrainXmlData(Unknown Source)at com.fsnip.web.controller.rest.pms.TrainRESTService.getSingleTrainXml(TrainRESTService.java:494)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1221)at com.gettec.fsnip.sso.client.AuthorizationFilter.doFilter(AuthorizationFilter.java:103)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)at org.jasig.cas.client.util.HttpServletRequestWrapperFilter.doFilter(HttpServletRequestWrapperFilter.java:75)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:246)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)at org.jasig.cas.client.authentication.AuthenticationFilter.doFilter(AuthenticationFilter.java:133)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:81)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)at com.gettec.fsnip.sso.client.CertLoginFilter.doFilter(CertLoginFilter.java:59)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:179)at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:241)at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)at org.mortbay.jetty.Server.handle(Server.java:326)at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)Caused by: java.net.SocketException: Software caused connection abort: socket write errorat java.net.SocketOutputStream.socketWrite0(Native Method)at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)at java.net.SocketOutputStream.write(SocketOutputStream.java:155)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)at java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1823)at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:719)at sun.rmi.transport.StreamRemoteCall.releaseOutputStream(StreamRemoteCall.java:115)at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:213)... 67 more


说明:

容易被错误信息开头(Could not connect to RMI Service...)迷惑,实际上,在该错误抛出后,还是可以调用该rmi 服务的其它方法,说明并不是找不到RMI Service。

折腾2天不得解,今天想会不会是参数的问题,结果,去掉第三个参数后,可以调用到方法,但还是可能出现EofException错误。进过多次实验,发现与返回数据的长度有关。发生EofException 错误是,打印发挥的部分数据(String类型)的字符长度为1200,Map 中只包含该数据时不会出错,再包含其他数据时将出错。

最终,将

getSingleTrainXmlData(train_id, user_id ,root_element);
方法的第3个参数去掉,代码运行无误。。。

总结:

RMI 服务接口不要带Element 类型的参数。

另外一点,上面方法的root_element 是以引用方式使用的,作为参数只是设置它的一部分属性,在该方法后面还会使用到root_element对象,也许这是个根本原因,因为还涉及到对象序列化的问题。