Fabric: как прослушивать несколько каналов в одном прослушивателе

#node.js #hyperledger-fabric

#node.js #hyperledger-fabric

Вопрос:

Мой код основан на https://github.com/hyperledger/fabric-samples/blob/master/off_chain_data/blockEventListener.js

Слушатель сейчас прослушивает только один канал. Я хотел бы включить его для прослушивания более одного канала.

Мой текущий код для добавления прослушивателей выглядит следующим образом:

 let network, listener
for (var i=0; i<channelid.length; i  ) {
    let cid = channelid[i]
    console.log(`Adding listener for channel ${cid}`)
    network = await gateway.getNetwork(cid)
    listener = await network.addBlockListener(
        async (event) => {
            await ProcessingMap.set(event.blockData.header.number, event.blockData)
            console.log(`[${cid}] Added block ${event.blockData.header.number} to ProcessingMap`)
        },
        { startBlock: parseInt(nextBlock, 10) }
    )

    console.log(`[${cid}]: Listening for block events, nextblock: ${nextBlock}`)
    processPendingBlocks(ProcessingMap, cid)
};
  

И это мой код для processPendingBlocks() :

 async function processPendingBlocks(ProcessingMap, channelid) {
    setTimeout(async () => {
        let nextBlockNumber = fs.readFileSync(configPath, "utf8")
        let processBlock

        do {
            processBlock = ProcessingMap.get(nextBlockNumber)
            if (processBlock == undefined) {
                break
            }

            try {
                await blockProcessing.processBlockEvent(channelid, processBlock, sdkAddress, sdkPort)
            } catch (error) {
                console.error(`Failed to process block: ${error}`)
            }

            ProcessingMap.remove(nextBlockNumber)
            fs.writeFileSync(configPath, parseInt(nextBlockNumber, 10)   1)
            nextBlockNumber = fs.readFileSync(configPath, "utf8")
        } while (true)

        processPendingBlocks(ProcessingMap, channelid)
    }, 250)
}
  

Это мой вывод:

 [root@isprintdev nodejs]# node blockEventListener.js
Wallet path: /root/nodejs/wallet
Adding listener for channel dsprintchannel
[dsprintchannel]: Listening for block events, nextblock: 1

Adding listener for channel esprintchannel
[dsprintchannel] Added block 1 to ProcessingMap
[dsprintchannel] Added block 2 to ProcessingMap
[dsprintchannel] Added block 3 to ProcessingMap
[dsprintchannel] Added block 4 to ProcessingMap
[dsprintchannel] Added block 5 to ProcessingMap
[dsprintchannel] Added block 6 to ProcessingMap
[dsprintchannel] Added block 7 to ProcessingMap
[dsprintchannel] Added block 8 to ProcessingMap
[dsprintchannel] Added block 9 to ProcessingMap
[dsprintchannel] Added block 10 to ProcessingMap
[dsprintchannel] Added block 11 to ProcessingMap
[dsprintchannel] Added block 12 to ProcessingMap
[dsprintchannel] Added block 13 to ProcessingMap
[dsprintchannel] Added block 14 to ProcessingMap
[dsprintchannel] Added block 15 to ProcessingMap
[dsprintchannel] Added block 16 to ProcessingMap
[dsprintchannel] Added block 17 to ProcessingMap
[esprintchannel]: Listening for block events, nextblock: 1

[esprintchannel] Added block 1 to ProcessingMap
[esprintchannel] Added block 2 to ProcessingMap
[esprintchannel] Added block 3 to ProcessingMap
[esprintchannel] Added block 4 to ProcessingMap
[esprintchannel] Added block 5 to ProcessingMap
[esprintchannel] Added block 6 to ProcessingMap
------------------------------------------------
  

Я вижу, что добавляются блоки из обоих каналов, но последующий вывод показывает, что обрабатываются только блоки из первого канала ( dsprintchannel ).

Как я должен изменить свой код, чтобы обрабатывались данные со всех каналов, а не только с первого канала?

Ответ №1:

Одна из проблем заключается в том, что ProcessingMap находится за пределами цикла, в котором вы создаете своих слушателей. Итак, по сути, у вас есть только одна карта, поэтому один канал сначала заполнит ProcessingMap[block_num], а затем последующие каналы просто снова установят ту же запись карты. Поэтому я бы переехал let ProcessingMap = new BlockMap() (https://github.com/hyperledger/fabric-samples/blob/master/off_chain_data/blockEventListener.js#L78 ) внутри вашего for (var i=0; i<channelid.length; i ) {...} цикла.