-
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个答案 按时间排序 按投票排序
-
采纳的答案
最后一个办法,tcpdump
抓包。
tcpdump -Xs 0 -i 网卡名如eth0 -vv -w a.cap port 端口号2012年3月20日 19:25
-
/etc/sysctl.conf这个文件只需要看下A跟B的一不一样就可以了。不一样就换成A的。
线程问题需要关注,你如何知道你每次就一个线程在调用。
每次开一个线程,那上个线程已经确保执行结束了?还是说没结束就强制掐掉。
既然每次就一个线程调用,为什么还要用线程池呢。单线程引入线程池只会增加问题,不会减少问题定位复杂度。2012年3月20日 19:23
-
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
-
B的调用方式是不是与C一模一样。
间歇性的出现意思是不是说时好时坏,不是每次调用都会出现。
这个应该是多线程调用同一端口造成的。
试试写个简单的单线程定时重复调用程序挂在B上跑,看会不会出现调用失败。2012年3月20日 18:55
相关推荐
NULL 博文链接:https://zhoudan241.iteye.com/blog/1432014
JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES错误是一种常见的网络编程错误,发生在Java应用程序中, especialmente 在 Linux 操作系统中。该错误的出现是由于进程打开的文件数量超过了操作系统的限制,导致服务器...
### 在Win7系统下抛出java.net.SocketException的解决办法 #### 问题背景及原因分析 在使用MyEclipse开发工具结合JBoss服务器进行项目开发的过程中,遇到一个常见但令人头疼的问题:当启动JBoss服务器时,控制台...
"java.net.SocketException Connection reset 解决方法" 在 Java 编程中,SocketException 是一种常见的异常,特别是在网络编程中。Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器...
Java中的`java.net.SocketException: Connection reset`是一个常见的网络编程错误,通常表示在TCP/IP通信过程中,连接突然中断。这个异常可能在客户端或服务器端发生,通常与数据传输的异常中断有关。 首先,我们来...
接口调用报错:java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory
Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:
5. **java.net.SocketException: Broken pipe** 在`Connect reset by peer`异常之后继续尝试写操作时,可能会遇到此异常。同样,需要确保在连接断开后不再进行无效的读写操作,并及时关闭Socket。 编写网络程序时...
connection reset解决方案(亲测可用).md
总的来说,使用Java与FastDFS集成,可以构建出强大的文件管理系统,实现高效的文件上传和下载,同时通过数据库存储文件元信息,便于管理和检索。在实际开发中,应结合具体业务需求,优化配置和代码实现,以达到最佳...
java.net.SocketException: Broken pipe 该异常可能发生在客户端和服务器端,原因是在连接断开后继续写数据。解决方法是确保在关闭连接前完成所有的数据传输,并检测对方的关闭连接操作。 编写网络程序时需要注意...
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 ...
1. **缓存机制**:Volley提供了一个基于内存和磁盘的两级缓存系统,可以减少网络请求,提高应用性能。当数据请求返回时,Volley会自动将结果存储到缓存中,以便后续请求可以快速从缓存中获取数据,减少了网络延迟。 ...
在Java中,Socket类和ServerSocket类分别用于客户端和服务端的通信建立。 2. **Hive数据同步需求**: 在大数据环境中,数据的实时同步是非常关键的。例如,当一个Hive集群中的数据发生变化时,可能需要将这些变化...
3. 错误信息:当Socket连接池出现问题时,可能会出现错误信息,如"java.net.SocketException: No buffer space available (maximum connections reached?): listen failed"。 解决方法 要解决线程太多导致Socket...
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ---> System.Net.Sockets.SocketException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集 ...
java.net.SocketException: Broken pipe 此异常与第4种异常类似,都是因为远程主机突然断开了连接。区别在于前者更多出现在写操作时,而后者则更普遍。为了避免这类异常,可以定期检测Socket的状态,例如通过设置...
“{“success”:false,”message”:”错误System.Net.Mail.SmtpException: Failure sending mail. —> System.Net.WebException: The remote name could not be resolved: ‘smtp.163.com’ 分析: 邮件发送相关...
1. **响应时间图**:默认的JMeter图形界面只提供基本的响应时间统计,而Standard插件提供了一种更直观的响应时间图,帮助测试人员更好地理解系统性能的波动。 2. **聚合报告增强**:标准插件改进了聚合报告,增加了...
import java.net.SocketException; public class UDPServer { public static void main(String[] args) { try { byte [] buffer = new byte[1024]; DatagramSocket socket = new DatagramSocket(4444); ...