2016-12-07 3 views
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 사용)에서이 작업을 수행 할 수있는 방법이 있습니까?

답변

0

시간 제한을 설정할 수 있으며 CXF가 연결을 중단합니다.

Client client = ClientProxy.getClient(proxy); 
HTTPConduit http = (HTTPConduit) client.getConduit(); 
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setConnectionTimeout(30000); // 30 seconds 
httpClientPolicy.setReceiveTimeout(300000); //5 minutes 
http.setClient(httpClientPolicy); 

매개 변수의 전체 목록은 here입니다. 0은 제한 시간 없음을 의미합니다.

기본 연결 시간 제한이 30 초이고 수신 시간 제한이 60 초이므로 수신이 잘되는지 확신 할 수 없으므로 중단되어야합니다.

+0

읽기 또는 연결보다는 쓰기로 인해 차단되므로이 경우가 아닙니다. 이러한 제한 시간은 기본적으로 설정됩니다. SO_KEEPALIVE와 비동기 연결로 변경되었습니다. 완벽하지는 않지만 시스템 keepalive 기간을 기준으로 시간 초과해야 함 – wbdarby

+0

비동기 클라이언트를 사용한 적이 없습니다. 설명서를 읽으면 솔루션이 작동 할 것입니다. 우선 SO_KEEPALIVE의 시간 제한을 기본값 인 2 시간보다 낮춰야합니다. 그것이 작동하면 답변을 게시하십시오! – pedrofb