0 0

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

有两台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 pipe
java.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 写道
B的调用方式是不是与C一模一样。
间歇性的出现意思是不是说时好时坏,不是每次调用都会出现。
这个应该是多线程调用同一端口造成的。
试试写个简单的单线程定时重复调用程序挂在B上跑,看会不会出现调用失败。


都说了是同一个程序了,这里没有多线程

问题补充:
aronlulu 写道
     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文件
在硬件没坏的情况下,程序也一模一样的情况下,就剩配置了。

好吧,我是用了多线程,但是我线程池大小设了1,通过队列来调度的,每次就开一个线程的。。。。
网络这次词很笼统的,还我说了本地机访问也有那个问题。/etc/sysctl.conf这个文件看了能给出个什么解释没有。。。。

问题补充:
aronlulu 写道
     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文件
在硬件没坏的情况下,程序也一模一样的情况下,就剩配置了。


[ffcs@hfcaiji1 logs]$ cat /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

问题补充:
aronlulu 写道
     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文件
在硬件没坏的情况下,程序也一模一样的情况下,就剩配置了。


哥哥,我还有个情况忘记说了,使用netstat命令查看服务发布的端口,在B端的连接已经断了,A端的连接还在,这可如何是好

问题补充:
aronlulu 写道
/etc/sysctl.conf这个文件只需要看下A跟B的一不一样就可以了。不一样就换成A的。
线程问题需要关注,你如何知道你每次就一个线程在调用。
每次开一个线程,那上个线程已经确保执行结束了?还是说没结束就强制掐掉。
既然每次就一个线程调用,为什么还要用线程池呢。单线程引入线程池只会增加问题,不会减少问题定位复杂度。


因为是任务调度啊,B和C一样的,C可以正常掉的哦
2012年3月20日 18:45

5个答案 按时间排序 按投票排序

0 0

采纳的答案

最后一个办法,tcpdump
抓包。
tcpdump -Xs 0 -i 网卡名如eth0 -vv -w a.cap port 端口号

2012年3月20日 19:25
0 0

用Wireshark分析a.cap文件,看tcp层的码流交互情况。

2012年3月20日 19:26
0 0

/etc/sysctl.conf这个文件只需要看下A跟B的一不一样就可以了。不一样就换成A的。
线程问题需要关注,你如何知道你每次就一个线程在调用。
每次开一个线程,那上个线程已经确保执行结束了?还是说没结束就强制掐掉。
既然每次就一个线程调用,为什么还要用线程池呢。单线程引入线程池只会增加问题,不会减少问题定位复杂度。

2012年3月20日 19:23
0 0

     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文件
在硬件没坏的情况下,程序也一模一样的情况下,就剩配置了。

2012年3月20日 19:07
0 0

B的调用方式是不是与C一模一样。
间歇性的出现意思是不是说时好时坏,不是每次调用都会出现。
这个应该是多线程调用同一端口造成的。
试试写个简单的单线程定时重复调用程序挂在B上跑,看会不会出现调用失败。

2012年3月20日 18:55

相关推荐

    java.net.SocketException: No route to host 异常原因

    NULL 博文链接:https://zhoudan241.iteye.com/blog/1432014

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES错误是一种常见的网络编程错误,发生在Java应用程序中, especialmente 在 Linux 操作系统中。该错误的出现是由于进程打开的文件数量超过了操作系统的限制,导致服务器...

    在Win7系统下抛出java.net.SocketException的解决办法

    ### 在Win7系统下抛出java.net.SocketException的解决办法 #### 问题背景及原因分析 在使用MyEclipse开发工具结合JBoss服务器进行项目开发的过程中,遇到一个常见但令人头疼的问题:当启动JBoss服务器时,控制台...

    java.net.SocketException Connection reset 解决方法

    "java.net.SocketException Connection reset 解决方法" 在 Java 编程中,SocketException 是一种常见的异常,特别是在网络编程中。Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器...

    java.net.SocketException: Connection reset 解决方法

    Java中的`java.net.SocketException: Connection reset`是一个常见的网络编程错误,通常表示在TCP/IP通信过程中,连接突然中断。这个异常可能在客户端或服务器端发生,通常与数据传输的异常中断有关。 首先,我们来...

    http接口调用报错.rar

    接口调用报错:java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory

    Linux下打开的文件过多错误

    Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:

    Java Socket常见异常处理

    5. **java.net.SocketException: Broken pipe** 在`Connect reset by peer`异常之后继续尝试写操作时,可能会遇到此异常。同样,需要确保在连接断开后不再进行无效的读写操作,并及时关闭Socket。 编写网络程序时...

    connection reset解决方案(亲测可用).md

    connection reset解决方案(亲测可用).md

    fastdfs使用java

    总的来说,使用Java与FastDFS集成,可以构建出强大的文件管理系统,实现高效的文件上传和下载,同时通过数据库存储文件元信息,便于管理和检索。在实际开发中,应结合具体业务需求,优化配置和代码实现,以达到最佳...

    Socket长连接异常处理

    java.net.SocketException: Broken pipe 该异常可能发生在客户端和服务器端,原因是在连接断开后继续写数据。解决方法是确保在关闭连接前完成所有的数据传输,并检测对方的关闭连接操作。 编写网络程序时需要注意...

    Ice-3.7.4.msi for windows版

    Caused by: java.net.ConnectException: Connection refused at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:574) at ...

    java.net.SocketException(解决方案).md

    项目中碰到的,记录一下解决方案

    Google I/O 2013推荐Android 网络通信框架Volley

    1. **缓存机制**:Volley提供了一个基于内存和磁盘的两级缓存系统,可以减少网络请求,提高应用性能。当数据请求返回时,Volley会自动将结果存储到缓存中,以便后续请求可以快速从缓存中获取数据,减少了网络延迟。 ...

    Hive2Hive-master.rar

    在Java中,Socket类和ServerSocket类分别用于客户端和服务端的通信建立。 2. **Hive数据同步需求**: 在大数据环境中,数据的实时同步是非常关键的。例如,当一个Hive集群中的数据发生变化时,可能需要将这些变化...

    如何解决线程太多导致java socket连接池出现的问题

    3. 错误信息:当Socket连接池出现问题时,可能会出现错误信息,如"java.net.SocketException: No buffer space available (maximum connections reached?): listen failed"。 解决方法 要解决线程太多导致Socket...

    System.SR.dll 无法显示错误信息

    System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ---&gt; System.Net.Sockets.SocketException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ...

    javaerror处理资料

    java.net.SocketException: Broken pipe 此异常与第4种异常类似,都是因为远程主机突然断开了连接。区别在于前者更多出现在写操作时,而后者则更普遍。为了避免这类异常,可以定期检测Socket的状态,例如通过设置...

    C# 服务器发送邮件失败实例分析

    “{“success”:false,”message”:”错误System.Net.Mail.SmtpException: Failure sending mail. —&gt; System.Net.WebException: The remote name could not be resolved: ‘smtp.163.com’ 分析: 邮件发送相关...

Global site tag (gtag.js) - Google Analytics