胡說叔叔
2021-04-06 13:19:56
我有一個Azure功能設(shè)置。其觸發(fā)器設(shè)置為服務(wù)總線隊(duì)列消息。觸發(fā)功能后,將以某種方式處理消息。如果在處理過程中遇到任何異常,我將處理該錯誤,并將消息保存在Azure表存儲集中作為輸出綁定,以進(jìn)行記錄。我想處理在向輸出綁定中寫入內(nèi)容時引發(fā)的所有錯誤。我將如何去做?錯誤詳情我在寫入輸出綁定(表存儲)期間遇到的錯誤之一是某些鍵的值無法保存。例如,消息中的鍵之一是numbertime類型的值。在寫入此數(shù)據(jù)時,我得到了一個例外,即鍵的值不能容納Int32數(shù)字。我認(rèn)為表存儲嘗試將數(shù)字轉(zhuǎn)換為Int32默認(rèn)值,但失敗了。要解決此問題,我將所有鍵都轉(zhuǎn)換為具有字符串值。現(xiàn)在我可以保存。但是我仍然想在寫入表存儲輸出綁定時處理任何不可預(yù)見的錯誤。在這種情況下,處理錯誤很重要,因?yàn)槿绻凑_使用服務(wù)總線消息,則不會在服務(wù)總線隊(duì)列中刪除該消息,并且在完成Azure函數(shù)執(zhí)行后,該消息再次觸發(fā)函數(shù),并且函數(shù)進(jìn)入不確定循環(huán)。以下是Azure函數(shù)的示例module.exports = async function (context, mySbMsg) { try{ // process service bus message await processMsg(mySbMsg); } catch(e) { // if processing fails, save the message in Azure table try{ // my own try to handle errors, but was unsuccessful await new Promise(function (resolve, reject) { context.bindings.tableBinding = []; context.bindings.tableBinding.push({ PartitionKey: mySbMsg.id|| "unknown", RowKey: time + "", errorMessage: e.message || "", ...mySbMsg }) resolve(); }); } catch (e) { // do something HERE; // exception on output binding didn't brought me here } } context.done();}
1 回答

侃侃無極
TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個贊
輸入和輸出綁定在函數(shù)范圍之外執(zhí)行,這就是為什么您不能在函數(shù)內(nèi)輸入catch塊的原因。如果要捕獲錯誤,則可以自己處理寫入存儲的操作,而不必使用輸出綁定。
但是,如果您無法寫入存儲,則服務(wù)總線隊(duì)列將不會在無限循環(huán)中觸發(fā)該功能。服務(wù)總線限制了重試次數(shù),一旦達(dá)到該限制,郵件就會移到單獨(dú)的死信隊(duì)列中,以避免無限循環(huán)。那里的消息不會過期-它們將一直坐在那里,直到您準(zhǔn)備好處理或刪除它們?yōu)橹埂?/p>
默認(rèn)的最大傳遞計數(shù)是10,您可以在隊(duì)列的屬性刀片上對其進(jìn)行配置。
至于處理死信隊(duì)列中的消息,我發(fā)現(xiàn)Service Bus Explorer非常有用。它使查看DLQ中的消息變得相當(dāng)簡單,然后將它們推回到主隊(duì)列中或?qū)⑵鋭h除。
您還可以通過編程方式訪問DLQ并構(gòu)建自動系統(tǒng)來處理這些消息。但是,由于消息無處可去,因此如果您的DLQ處理程序無法解析消息,您可能會陷入循環(huán)。
添加回答
舉報
0/150
提交
取消