在项目中集成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初始化时虽然设置了参数但是不生效