[英]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方法,將創建第一個實體,然后從現有實體中檢索第二個實體; 使用異步,第二個實體可能會通過findByName
並save
因為第一個實體尚未保存,這導致第二個實體的save
引發唯一標識符錯誤。
有沒有一種方法可以添加一些容錯機制來具有某些功能,例如重試和skipAfterRetry,尤其是對於數據庫操作。
在這種特殊情況下,您應該將數組轉換為地圖。 使用name屬性作為鍵,因此不會有重復的條目。
但是,如果也可以由多個線程(例如,它在Web服務器中)調用此方法,或者有多個實例在運行,則它仍然不是故障安全的。
通常,應該讓數據庫檢查唯一性。 沒有最安全/最簡單的方法。 將save方法放入try-catch塊中,然后檢查/處理唯一標識符異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.