我用的方法是
subscription = web3j.pendingTransactionFlowable().subscribe(tx -> {
});
监听到的数据大概晚了6-10秒
使用的是WebSocket连接,同样的节点用web3.js监听就没有任何问题,我该如何排查问题呢,需要用到java,,对了是BSC节点
同样尝试了方法 subscription = web3j.ethPendingTransactionHashFlowable().subscribe(hash -> { 还是一样的结果
zen 回答的没错,web3j 监听模式,默认15秒获取一次,filter的拦截结果。你可以通过指定interval的形式,降低间隔时间
public JsonRpc2_0Web3j(Web3jService web3jService) {
this(web3jService, 15000L, Async.defaultExecutorService());
}
public JsonRpc2_0Web3j(Web3jService web3jService, long pollingInterval, ScheduledExecutorService scheduledExecutorService) {
this.web3jService = web3jService;
this.web3jRx = new JsonRpc2_0Rx(this, scheduledExecutorService);
this.blockTime = pollingInterval;
this.scheduledExecutorService = scheduledExecutorService;
}
调用web3.build有两个重构方法分别为
static Web3j build(Web3jService web3jService) {
return new JsonRpc2_0Web3j(web3jService);
}
static Web3j build(Web3jService web3jService, long pollingInterval, ScheduledExecutorService scheduledExecutorService) {
return new JsonRpc2_0Web3j(web3jService, pollingInterval, scheduledExecutorService);
}
通过源码可知,web3.build(web3Service)
调用的是JsonRpc2_0Web3j****(Web3jService web3jService)
。而该函数初始时传递的间隔时间为15000L
。为了改变这个值,我们可以使用另外一个build初始化web3,例如
Web3j web3j = Web3j.build(new WebSocketService("ws://xxx",true),200L, org.web3j.utils.Async.defaultExecutorService())
这样你在监听pending的时候就可以200ms获取一次结果,如果性能够好,完全可以直接改成10ms。web3j的版本是4.9.1。但是我记4.8.4也是支持,如果没有上述build方法,可以尝试进行升级