1
오늘 자바 사용자가 이상한 상황이 발생하여 Java 기반 CXF 클라이언트가 원격 소켓에 쓰려고 끊어졌습니다. 여기 CXF에서 쓰기 제한 시간을 감지하고 처리하는 방법
과정을 나타내는 약칭 스택 트레이스가 CXF 기반 JAX-WS 인터페이스에 기록 막혔다 같습니다java.net.SocketOutputStream.socketWrite0
java.net.SocketOutputStream.socketWrite
...
org.apache.cxf.io.AbstractWrappedOutputStream.write
org.apache.cxf.io.AbstractThresholdOutputStream.write
...
org.apache.cxf.jaxws.JaxWsClientProxy.invoke
com.sun.proxy.$Proxy143.getAllBusLmp
name.willdarby.trading.pjmService.PjmUpdateChecker.load5MinBus
netstat과이 소켓을 도시하는 접속 버퍼 물품 전체하다 다음 보였다 :
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 482 182000 ip-xxx.xxx-xxx-xxx.ip.:41368 xxx.xxx.com:https ESTABLISHED
제가 알기에 OS는 소켓이 여전히 살아 있다고 생각했기 때문에 쓰기가 차단되었습니다. 그것은 적어도 45 분 동안이 상태에있었습니다. 5 분 후에 차단 된 쓰기를 감지하고 소켓을 재설정하고 싶습니다. CXF (현재 버전 3.1.4 사용)에서이 작업을 수행 할 수있는 방법이 있습니까?
읽기 또는 연결보다는 쓰기로 인해 차단되므로이 경우가 아닙니다. 이러한 제한 시간은 기본적으로 설정됩니다. SO_KEEPALIVE와 비동기 연결로 변경되었습니다. 완벽하지는 않지만 시스템 keepalive 기간을 기준으로 시간 초과해야 함 – wbdarby
비동기 클라이언트를 사용한 적이 없습니다. 설명서를 읽으면 솔루션이 작동 할 것입니다. 우선 SO_KEEPALIVE의 시간 제한을 기본값 인 2 시간보다 낮춰야합니다. 그것이 작동하면 답변을 게시하십시오! – pedrofb