1000 请问 java 在使用web3j监听pending的时候存在十几秒的延迟,该如何定位问题

我用的方法是

subscription = web3j.pendingTransactionFlowable().subscribe(tx -> {

});

监听到的数据大概晚了6-10秒

使用的是WebSocket连接,同样的节点用web3.js监听就没有任何问题,我该如何排查问题呢,需要用到java,,对了是BSC节点

同样尝试了方法 subscription = web3j.ethPendingTransactionHashFlowable().subscribe(hash -> { 还是一样的结果

请先 登录 后评论

最佳答案 2022-04-14 10:47

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方法,可以尝试进行升级

请先 登录 后评论

其它 4 个回答

Tiny熊
  擅长:智能合约,以太坊
请先 登录 后评论
chuduchen
请先 登录 后评论
雨宫莲
请先 登录 后评论
zen
请先 登录 后评论
  • 5 关注
  • 4 收藏,4985 浏览
  • 提出于 2022-04-13 00:01