簡體   English   中英

spring boot如何在異步方法中處理容錯?

[英]spring boot how to handle fault tolerance in async method?

假設我有一個調用者將工作分配給多個異步任務:

public class Caller{
    public boolean run() {
        for (int i = 0: i< 100; i++) {
            worker.asyncFindOrCreate(entites[i]);
        }
        return true;
    }

public class Worker{
    @Autowired
    Dao dao;

    @Async
    public E asyncFindOrCreate(User entity) {
        return dao.findByName(entity.getName).elseGet(() -> dao.save(entity));
    }
}

如果我們有兩個相同的實體:使用synced方法,將創建第一個實體,然后從現有實體中檢索第二個實體; 使用異步,第二個實體可能會通過findByNamesave因為第一個實體尚未保存,這導致第二個實體的save引發唯一標識符錯誤。

有沒有一種方法可以添加一些容錯機制來具有某些功能,例如重試和skipAfterRetry,尤其是對於數據庫操作。

在這種特殊情況下,您應該將數組轉換為地圖。 使用name屬性作為鍵,因此不會有重復的條目。

但是,如果也可以由多個線程(例如,它在Web服務器中)調用此方法,或者有多個實例在運行,則它仍然不是故障安全的。

通常,應該讓數據庫檢查唯一性。 沒有最安全/最簡單的方法。 將save方法放入try-catch塊中,然后檢查/處理唯一標識符異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM