Linux系统引起java.net.SocketException: Broken pipe的原因?

问题描述

有两台linux服务器A、B系统版本都是 Red Hat Enterprise Linux Server release 6.0 (Santiago)JDK版本都是 1.6.0_29在A端发布一个RMI服务,配置如下<bean id="rmiServerHost" factory-method="setProperty" class="java.lang.System" lazy-init="false"> <constructor-arg value="java.rmi.server.hostname"/> <constructor-arg value="${rmiServerHost}"/> </bean> <bean factory-method="setProperty" class="java.lang.System" lazy-init="false"> <constructor-arg value="java.rmi.dgc.leaseValue"/> <constructor-arg value="300000"/> </bean> <bean factory-method="setProperty" class="java.lang.System" lazy-init="false"> <constructor-arg value="java.rmi.dgc.gcInterval"/> <constructor-arg value="900000"/> </bean> <!--接收数据服务(下层模块提交的数据)--> <bean id="eventProcessor" class="com.dataservice.EventProcessorImpl"/> <bean id="rmiEventProcess" class="org.springframework.remoting.rmi.RmiServiceExporter"> <property name="serviceName" value="dataservice/eventProcessor" /> <property name="service" ref="eventProcessor" /> <property name="serviceInterface" value="com.dataservice.EventProcessor" /> <property name="registryPort" value="${registryPort}"/> <property name="servicePort" value="${registryPort}"/> </bean>B端为客户端,配置如下<!--目标模块数据处理配置--> <bean id="rmiEventProcessorClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"><property name="serviceUrl" value="${targetAddr}" /><property name="serviceInterface"value="com.dataservice.EventProcessor" /><property name="refreshStubOnConnectFailure" value="true"></property></bean>情况是这样的,B端在调用A端发布的服务时,间歇性的出现如下异常。异常信息:error marshalling arguments; nested exception is: java.net.SocketException: Broken pipejava.rmi.MarshalException: error marshalling arguments; nested exception is: java.net.SocketException: Broken pipe at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:138) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) at $Proxy0.invoke(Unknown Source) at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:398) at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:344) at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:259) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at $Proxy1.handleEvent(Unknown Source) at com.dataservice.EventSenderImpl.handleEvent(EventSenderImpl.java:220) at com.dataservice.EventSenderImpl.sendEventTask(EventSenderImpl.java:191) at com.dataservice.EventSenderImpl.access$0(EventSenderImpl.java:173) at com.dataservice.EventSenderImpl$ResSendTask.run(EventSenderImpl.java:166) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)Caused by: java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:136) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) at java.io.BufferedOutputStream.write(BufferedOutputStream.java:109) at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1847) at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1885) at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1546) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:333) at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:274) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:133) ... 22 more补充:相同的程序,放在linux版本相同,JDK版本相同的服务器C去调用A不会出现以上问题,B、和C的防火墙策略是相同的,防火墙关了也会有这个问题,就算把服务端部署在B,B内部调用也会间歇性出现该问题。奔溃了,搞不定啊,求解。。。。 问题补充:aronlulu 写道

解决方案

最后一个办法,tcpdump抓包。tcpdump -Xs 0 -i 网卡名如eth0 -vv -w a.cap port 端口号
解决方案二:
用Wireshark分析a.cap文件,看tcp层的码流交互情况。
解决方案三:
/etc/sysctl.conf这个文件只需要看下A跟B的一不一样就可以了。不一样就换成A的。线程问题需要关注,你如何知道你每次就一个线程在调用。每次开一个线程,那上个线程已经确保执行结束了?还是说没结束就强制掐掉。既然每次就一个线程调用,为什么还要用线程池呢。单线程引入线程池只会增加问题,不会减少问题定位复杂度。
解决方案四:
at com.dataservice.EventSenderImpl.sendEventTask(EventSenderImpl.java:191) at com.dataservice.EventSenderImpl.access$0(EventSenderImpl.java:173) at com.dataservice.EventSenderImpl$ResSendTask.run(EventSenderImpl.java:166) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150) 显然有多线程。要么你就检查你的网络,包括tcp层的配置,/etc/sysctl.conf文件在硬件没坏的情况下,程序也一模一样的情况下,就剩配置了。
解决方案五:
B的调用方式是不是与C一模一样。间歇性的出现意思是不是说时好时坏,不是每次调用都会出现。这个应该是多线程调用同一端口造成的。试试写个简单的单线程定时重复调用程序挂在B上跑,看会不会出现调用失败。

时间: 2024-10-31 17:26:55

Linux系统引起java.net.SocketException: Broken pipe的原因?的相关文章

[android]MonkeyRunner“java.net.SocketException: Broken pipe”错误解决办法

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice import time import random d=MonkeyRunner.waitForConnection() d.wake() for i in range(0,100): #TOUCH|{'x':55,'y':795,'type':'downAndUp',} d.startActivity(action='android.intent.action.MAIN

如何重现java.net.SocketException: Broken Pipe

问题描述 问题很简单,如何重现java.net.SocketException:BrokenPipejava.net.SocketException:Brokenpipeatjava.net.SocketOutputStream.socketWrite0(NativeMethod)atjava.net.SocketOutputStream.socketWrite(SocketOutputStream.java:105)atjava.net.SocketOutputStream.write(Soc

工具-Linux系统下java程序如何将PDF文件转换成SWF文件

问题描述 Linux系统下java程序如何将PDF文件转换成SWF文件 我需要将PDF文件转换成SWF格式的文件,目前是用windows系统开发java程序,windows系统中这种转型已经搞定,用的是swftools工具.但是开发完成之后,程序要部署到Linux系统中.由于不熟悉Linux系统所以无从下手,希望高手指点,最好也用swftools工具转型,尽量详细一些,跪谢. 解决方案 前不久刚用过,应该注意的是swftools工具在linux的安装,有时需要依赖才能安装下去,这个工具安装好就基

Linux系统下java程序如何将Swf的每一帧都转换成图片?

问题描述 Linux系统下java程序如何将Swf的每一帧都转换成图片? Linux系统下java程序如何将Swf的每一帧都转换成图片? 解决方案 如何将pdf图片转换成jpg

linux系统nginx+java+php的环境配置教程

一.配置目标 1.通过lnmp完成基础环境的安装 通过lnmp安装后,相关软件的位置请参考其官方说明.安装后我单独通过气官方说明,升级了nginx的版本 2.配置nginx使之能满足php+java环境在一台机器上的复用     二.相关安装说明 1.将tomcat安装到/usr/local/tomcat6 2.将nginx安装到/usr/local/nginx 3.将java项目安装到tomcat6/webapps下   4.将php相关项目直接安装到/usr/local/下     三.相关

swf-Linux系统下java程序如何将PDF文件转换成SWF文件

问题描述 Linux系统下java程序如何将PDF文件转换成SWF文件 我需要将PDF文件转换成SWF格式的文件,目前是用windows系统开发java程序,windows系统中这种转型已经搞定,用的是swftools工具,版本是swftools-2013-04-09-1007. 程序开发完成后,需要要部署到Linux系统中.在网上Linux实现的例子比较少,尝试了很多次都没能成功.我现在有Linux系统的swftools-2013-04-09-1007.tar.gz工具,有已经实现功能的朋友,

TNS-12518 &amp; Linux Error:32:Broken pipe

最近一周,有一台ORACLE数据库服务器的监听服务在凌晨2点过几分的时间点突然崩溃,以前从没有出现过此类情况,但是最近一周出现了两次这种情况,检查时发现了如下一些信息: $ lsnrctl services   LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 12-DEC-2014 08:22:34   Copyright (c) 1991, 2007, Oracle.  All rights reserved.   Connectin

Linux系统小技巧(1):/dev/random设备可能导致java程序启动慢或者操作耗时不正常

致因 Linux系统上的设备/dev/random和/dev/urandom是不同的.这点可以使用下面的命令测试出来(执行会耗费几分钟时间,请有心理准备) for dev in /dev/random /dev/urandom;do echo "test ${dev}: " time dd if=${dev} bs=512 count=1 > /dev/null 2>&1 time dd if=${dev} bs=512 count=1 > /dev/null

java-如何用Java在linux系统下创建超链接按钮

问题描述 如何用Java在linux系统下创建超链接按钮 如何用Java在linux系统下创建超链接按钮如何用Java在linux系统下创建超链接按钮如何用Java在linux系统下创建超链接按钮 解决方案 我不知道,你问的是什么?