spring boot如何在异步方法中处理容错?

时间:2019-05-31 19:17:38

标签: spring-boot asynchronous spring-data-jpa

假设我有一个呼叫者将工作分配给多个异步任务:

<input type="text" class="form-control" id="dateOfBirth" name="dateOfBirth" bsDatePicker #dp="bsDatepicker" [(ngModel)]="dateOfBirth" placeholder="DateOfBirth">

// call the dp.show() method either by attaching the click event on the input or add a button alongside it

如果我们有2个相同的实体: 使用同步方法,将创建第一个,然后从现有实体中检索第二个; 如果使用异步,则第二个实体可能会通过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)); } } 并转到findByName,因为第一个实体尚未保存,这导致第二个实体的save抛出唯一标识符错误。

是否可以添加一些容错机制来具有某些功能,例如重试和skipAfterRetry,尤其是对于数据库操作。

1 个答案:

答案 0 :(得分:0)

在这种特殊情况下,您应该将数组转换为地图。使用name属性作为键,这样就不会有重复的条目。

但是,如果该方法也可以被多个线程调用(例如,它位于Web服务器中),或者有多个实例在运行,则它仍然不是故障安全的。

一般来说,您应该让数据库检查唯一性。没有最安全/最简单的方法。将save方法放入try-catch块中,然后检查/处理唯一标识符异常。