diff --git a/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java b/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java index de6d71ec..a4fc788d 100644 --- a/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java @@ -28,6 +28,10 @@ public interface PrinterMapper { int updateTaskStatus(@Param("id") Integer id, @Param("status") Integer status); + int compareAndSetTaskStatus(@Param("id") Integer id, + @Param("expectStatus") Integer expectStatus, + @Param("newStatus") Integer newStatus); + PrintTaskEntity getTaskById(Integer id); List listByScenicId(@Param("scenicId") Long scenicId); @@ -51,4 +55,4 @@ public interface PrinterMapper { void updateUserPhotoListToPrinter(Long memberId, Long scenicId, Integer printerId); List listRelationByOrderId(Long orderId); -} \ No newline at end of file +} diff --git a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java index 9cebb8fd..08f0e5e2 100644 --- a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java @@ -69,6 +69,8 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; @Slf4j @@ -151,11 +153,26 @@ public class PrinterServiceImpl implements PrinterService { printer.setPrinters(printersStr); printerMapper.update(printer); } - PrintTaskResp task = printerMapper.findTaskByPrinterId(printer.getId()); - if (task == null) { - return Collections.emptyList(); + syncTaskLock.lock(); + try { + while (true) { + PrintTaskResp task = printerMapper.findTaskByPrinterId(printer.getId()); + if (task == null) { + return Collections.emptyList(); + } + int updatedRows = printerMapper.compareAndSetTaskStatus( + task.getId(), + TASK_STATUS_PENDING, + TASK_STATUS_PROCESSING + ); + if (updatedRows == 1) { + task.setStatus(TASK_STATUS_PROCESSING); + return Collections.singletonList(task); + } + } + } finally { + syncTaskLock.unlock(); } - return Collections.singletonList(task); } @Override @@ -427,6 +444,9 @@ public class PrinterServiceImpl implements PrinterService { @Autowired private RedisTemplate redisTemplate; private static final String USER_PHOTO_LIST_TO_PRINTER = "USER_PHOTO_LIST_TO_PRINTER:"; + private static final int TASK_STATUS_PENDING = 0; + private static final int TASK_STATUS_PROCESSING = 3; + private final Lock syncTaskLock = new ReentrantLock(); @Override public void setUserIsBuyItem(Long memberId, Long id, Long orderId) { @@ -550,4 +570,4 @@ public class PrinterServiceImpl implements PrinterService { printTaskMapper.insertTask(task); }); } -} \ No newline at end of file +} diff --git a/src/main/resources/mapper/PrinterMapper.xml b/src/main/resources/mapper/PrinterMapper.xml index 54177f37..567c5eb6 100644 --- a/src/main/resources/mapper/PrinterMapper.xml +++ b/src/main/resources/mapper/PrinterMapper.xml @@ -152,6 +152,11 @@ UPDATE print_task SET status = #{status}, update_time = NOW() WHERE id = #{id} + + UPDATE print_task + SET status = #{newStatus}, update_time = NOW() + WHERE id = #{id} AND status = #{expectStatus} + UPDATE member_print SET crop_url = #{url}, update_time = NOW(), print_url = null WHERE id = #{id} @@ -172,4 +177,4 @@ DELETE FROM member_print WHERE member_id = #{memberId} AND scenic_id = #{scenicId} AND id = #{relationId} LIMIT 1; - \ No newline at end of file +