Connect timed out 익셉션 오류

간헐적으로 트랜잭션 요청시 타임아웃 익셉션이 발생합니다.

(트랜잭션 기록이 남지 않는걸 보면 요청자체를 못한 것 같습니다.)

익셉션 발생하는 코드
ransactionReceipt.TransactionReceiptData receipt = contract.getMethod(“retrieveToken”).send(params, getSendOptions(keyring));

java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_292]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_292]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_292]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_292]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_292]

혹시 의심가는 곳이 있을까요?!

안녕하세요.
알려주신 정보로는 파악을 하기가 힘들 것 같습니다만, 기본적으로 Timeout exception이 발생하는 이유는 클라이언트의 요청에 서버로부터의 응답이 없을 때 발생하는 것으로 알고 있습니다.

사용하고 있으신 EN의 상태와 EN의 정책을 살펴보시는게 좋을 것 같습니다.

감사합니다.

네 답변 감사합니다.
EN의 상태는 이상 없네요. 간헐적으로 발생하는데 더 자세한 에러 로그 공유드리겠습니다.

IOException 발생하는 코드
ransactionReceipt.TransactionReceiptData receipt = contract.getMethod(“retrieveToken”).send(params, getSendOptions(keyring));

java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:607)
at okhttp3.internal.platform.Platform.connectSocket(Platform.kt:117)
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:266)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:180)
at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:238)
at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:111)
at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:79)
at okhttp3.internal.connection.Transmitter.newExchange$okhttp(Transmitter.kt:163)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:35)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:194)
at okhttp3.RealCall.execute(RealCall.kt:67)
at org.web3j.protocol.http.HttpService.performIO(HttpService.java:160)
at org.web3j.protocol.Service.send(Service.java:48)
at org.web3j.protocol.core.Request.send(Request.java:87)
at com.klaytn.caver.transaction.AbstractTransaction.fillTransaction(AbstractTransaction.java:442)
at com.klaytn.caver.transaction.AbstractTransaction.sign(AbstractTransaction.java:282)
at com.klaytn.caver.wallet.KeyringContainer.sign(KeyringContainer.java:262)
at com.klaytn.caver.wallet.KeyringContainer.sign(KeyringContainer.java:246)
at com.klaytn.caver.contract.ContractMethod.sign(ContractMethod.java:368)
at com.klaytn.caver.contract.ContractMethod.send(ContractMethod.java:281)
at com.klaytn.caver.contract.ContractMethod.send(ContractMethod.java:242)

안녕하세요.

에러 로그 감사합니다.

분석해보니, fillTransaction이라는 함수에서 에러가 난 것으로 보이는데요. 이 함수는 nonce, chainId, gasPrice를 클레이튼 노드에 query하여 Transaction의 각 필드에 채워넣는 역할을 합니다.

여기서 필드 중 하나를 클레이튼 노드에 쿼리했는데 응답값을 못받아서 SDK에서 Exception을 낸 것 같은데요. 이럴 경우에는 이 Exception을 catch하셔서 직접 handling하시는 게 맞는 것 같습니다.

감사합니다.