WxJava 报错超时

在项目中集成WxJava做微信开放平台第三方平台开发,使用小程序上传代码接口时报错如下

小程序提交审核失败,原因:me.chanjar.weixin.common.error.WxRuntimeException: java.net.SocketTimeoutException: Read timed out
        at cn.binarywang.wx.miniapp.api.impl.BaseWxMaServiceImpl.executeInternal(BaseWxMaServiceImpl.java:289)
        at cn.binarywang.wx.miniapp.api.impl.BaseWxMaServiceImpl.execute(BaseWxMaServiceImpl.java:210)
        at cn.binarywang.wx.miniapp.api.impl.BaseWxMaServiceImpl.post(BaseWxMaServiceImpl.java:184)
        at me.chanjar.weixin.open.api.impl.WxOpenMaServiceImpl.codeCommit(WxOpenMaServiceImpl.java:185)

很明显是提交代码时间过长,导致超时。看了WxJava源码默认超时时间是5s

DefaultApacheHttpClientBuilder.java

/**
   * 建立链接的超时时间,默认为5000ms.由于是在链接池获取链接,此设置应该并不起什么作用
   * <p>
   * 设置为零时不超时,一直等待.
   * 设置为负数是使用系统默认设置(非上述的5000ms的默认值,而是httpclient的默认设置).
   * </p>
   */
  private int connectionTimeout = 5000;
  /**
   * 默认NIO的socket超时设置,默认5000ms.
   */
  private int soTimeout = 5000;

于是调整在初始化WxOpenService时修改链接时间

DefaultApacheHttpClientBuilder clientBuilder = DefaultApacheHttpClientBuilder.get();
clientBuilder.setSoTimeout(30000);//连接池socket超时时间(单位ms)
inRedisConfigStorage.setApacheHttpClientBuilder(clientBuilder);

本以为调整完成后就万事大吉了,结果发现还是不行。

经过检查后发现项目里面还用到了WxJava的 WxCpService,在WxCpService初始化时没有设置超时时间。

//WxCpService初始化
WxCpService service = new WxCpServiceImpl();
service.setWxCpConfigStorage(configStorage);



//在WxCpService的setWxCpConfigStorage 方法中调用了initHttp() 方法,initHttp()方法源码如下
public void initHttp() {
        ApacheHttpClientBuilder apacheHttpClientBuilder = this.configStorage.getApacheHttpClientBuilder();
        if (null == apacheHttpClientBuilder) {
            apacheHttpClientBuilder = DefaultApacheHttpClientBuilder.get();
        }

        ((ApacheHttpClientBuilder)apacheHttpClientBuilder).httpProxyHost(this.configStorage.getHttpProxyHost()).httpProxyPort(this.configStorage.getHttpProxyPort()).httpProxyUsername(this.configStorage.getHttpProxyUsername()).httpProxyPassword(this.configStorage.getHttpProxyPassword());
        if (this.configStorage.getHttpProxyHost() != null && this.configStorage.getHttpProxyPort() > 0) {
            this.httpProxy = new HttpHost(this.configStorage.getHttpProxyHost(), this.configStorage.getHttpProxyPort());
        }

         //就是这行代码导致HttpClient使用默认配置进行了初始化
        this.httpClient = ((ApacheHttpClientBuilder)apacheHttpClientBuilder).build();
    }



//而DefaultApacheHttpClientBuilder.get()获取到的是默认配置,调用build()方法后使用默认配置创建了HttpClient。以下是build()方法的源码
public CloseableHttpClient build() {
    //此处判断是否初始化过,如果没有初始化就初始化
    if (!prepared.get()) {
        //prepare()方法会初始化closeableHttpClient对象
      prepare();
    }
    return this.closeableHttpClient;
  }

以上就真相大白,原来项目启动时WxCpService初始化,由于ConfigStorage没有设置ApacheHttpClientBuilder,导致DefaultApacheHttpClientBuilder.get().build()使用默认配置执行了初始化,然后WxOpenService初始化时虽然设置了参数但是不生效

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值