#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 ) {...}
цикла.