以太坊中web3j调用公链超时问题,重构httpservice即可

         在学习使用java集成web3j调用eth公链出现以下问题:SocketTimeoutException异常,具体的异常错误就不截图了,主要是执行下面代码发送的

Web3j.build(new HttpSerivceEx(ApplicationConfig.gethUrl)).ethSendRawTransaction(hexValue).send();

此代码主要是进行发送离线交易,由于返回了超时异常,然后系统认为此次交易失败了。然后实际上此笔交易真实的情况是已经发出了,只是此次请求的时间到了,导致了并未接受到正确的返回,因此就会丢失此次交易的hashId。

       这个时候只能去反编译看代码,发现web3j发送请求实际是用的okhttp3的方式,并且默认的超时时间是10s,这个在网络环境非常复杂的公链环境无法满足需求,因此考虑重新构建发送的okhttp3的属性。所以重写下Httpservice即可如下:

public class HttpSerivceEx extends HttpService {

然后在创建okhttpclient时设定请求超时时间即可

 private static OkHttpClient createOkHttpClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        configureLogging(builder);
        MyOkHttpRetryInterceptor myOkHttpRetryInterceptor = new MyOkHttpRetryInterceptor.Builder()
            .executionCount(3).retryInterval(1000).build();
        builder.addInterceptor(myOkHttpRetryInterceptor);
        builder.retryOnConnectionFailure(true);
        log.info("---------设置超时时间--------{}秒",120);
        builder.connectionPool(new ConnectionPool())
            .connectTimeout(120, TimeUnit.SECONDS)
            .readTimeout(120, TimeUnit.SECONDS).build();
        return builder.build();
    }

上述还设定了超时自动重发的机制,实际的生产环境是没有的,因为eth的nonce机制,重发并没有什么意义。

你可能感兴趣的:(以太坊中web3j调用公链超时问题,重构httpservice即可)