如何在Hive区块链中重启交易与区块数据流
Hive-JS区块流重启实现方案
hive-js的getBlockStream返回的是单次消费的Node.js可读流,触发end事件后流资源会被释放,没有内置的重启方法,你可以通过封装流初始化逻辑的方式实现重启,同时可以通过记录已处理区块高度避免重启后数据丢失。
具体实现逻辑
- 维护外层变量存储当前流实例、已处理的最新区块高度,避免重复监听和数据丢失
- 封装统一的流初始化方法,每次创建新流前先销毁旧流
- 在流的
end或error事件回调中调用初始化方法即可实现重启
代码示例
核心初始化与重启逻辑
// 外层维护变量 let currentStream = null; let lastProcessedBlock = 0; // 无需续传区块可删除该变量 // 原有区块处理逻辑 const handleBlock = (block) => { // 你的业务代码 lastProcessedBlock = block.number; // 更新已处理区块高度,无需续传可删除该行 }; // 原有错误处理逻辑 const errorBlock = (err) => { console.error('流异常:', err); restartBlockStream(); // 异常场景也可触发重启 }; // 流初始化方法 const initBlockStream = () => { // 销毁旧流,避免内存泄漏和重复监听 if (currentStream) { currentStream.removeAllListeners(); currentStream.destroy(); } // 构造流配置,无需续传可直接写为 { mode: dhive.BlockchainMode.Latest } const streamConfig = lastProcessedBlock > 0 ? { mode: dhive.BlockchainMode.From, from: lastProcessedBlock + 1 } : { mode: dhive.BlockchainMode.Latest }; // 创建新流并绑定事件 currentStream = client.blockchain.getBlockStream(streamConfig) .on('data', handleBlock) .on('error', errorBlock) .on('end', () => { console.log('流已结束,正在重启'); restartBlockStream(); }); }; // 重启方法 const restartBlockStream = () => { initBlockStream(); }; // 首次启动流 initBlockStream();
调整后的暂停/恢复逻辑
// 暂停流 const pauseStream = async () => { currentStream?.pause(); }; // 恢复流 const resumeStream = async () => { currentStream?.resume(); };
注意事项
- 如果不需要续传断开前的区块,可直接删除
lastProcessedBlock相关逻辑,每次都从最新区块开始拉取 - 旧流销毁步骤不可省略,否则会出现内存泄漏、事件重复触发的问题
内容的提问来源于stack exchange,提问作者loretoparisi
相关产品推荐
相关产品推荐

