You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hive区块链中重启交易与区块数据流

Hive-JS区块流重启实现方案

hive-js的getBlockStream返回的是单次消费的Node.js可读流,触发end事件后流资源会被释放,没有内置的重启方法,你可以通过封装流初始化逻辑的方式实现重启,同时可以通过记录已处理区块高度避免重启后数据丢失。

具体实现逻辑

  1. 维护外层变量存储当前流实例、已处理的最新区块高度,避免重复监听和数据丢失
  2. 封装统一的流初始化方法,每次创建新流前先销毁旧流
  3. 在流的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:15:05