Browse Source

7.31 启用失败重试机制

Mechrevo 1 year ago
parent
commit
650d09da82

+ 10 - 0
sp-core/sp-base/pom.xml

@@ -28,6 +28,16 @@
         </dependency>
 		<!-- ================= 模块依赖 end ================= -->
 
+        <!-- 失败重试机制 spring-retry -->
+        <dependency>
+            <groupId>org.springframework.retry</groupId>
+            <artifactId>spring-retry</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+
         <!-- 异步通信 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 1 - 1
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/GoodsTransitAppController.java

@@ -55,7 +55,7 @@ public class GoodsTransitAppController {
     /** app端 商户确认订单*/
     @RequestMapping("purchaseLevelOntGoodsTransit")
 //    @SaCheckPermission(TbGoodsTransit.PERMISSION_CODE_ADD)
-    public AjaxJson purchaseLevelOntGoodsTransit(@Validated @RequestBody PurchaseLevelOneGoodsTransitParam purchaseLevelOneGoodsTransitParam){
+    public AjaxJson purchaseLevelOntGoodsTransit(@Validated @RequestBody PurchaseLevelOneGoodsTransitParam purchaseLevelOneGoodsTransitParam) throws Exception {
         boolean goods = tbGoodsTransitService.purchaseLevelOntGoodsTransit(purchaseLevelOneGoodsTransitParam);
         if(goods){
             return AjaxJson.getSuccess("提交成功,待商家确认订单!");

+ 15 - 3
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/MethodGoodsTransitService.java

@@ -6,6 +6,7 @@ import com.pj.enummj.EnterpriseConfirm;
 import com.pj.rabbitmq.config.RabbitMqConfig;
 import com.pj.tb_enterprise.TbEnterprise;
 import com.pj.tb_goods.TbGoods;
+import com.pj.tb_goods_transit.retry.SmsRetryService;
 import com.pj.tb_goods_type.TbGoodsTypeService;
 import com.pj.tb_order.TbOrder;
 import com.pj.tb_people.TbPeople;
@@ -40,19 +41,24 @@ public class MethodGoodsTransitService {
     @Autowired
     private AmqpTemplate amqpTemplate;
 
+    /** 短信运营商 */
+    @Autowired
+    private SmsRetryService smsRetryService;
+    //todo:
+
 
 
     /**
      * 给边民组组员发送短信通知
      */
-    public int sendSms(List<TbPeople> peopleIdList){
+    public int sendSms(List<TbPeople> peopleIdList) {
 
         //获取当前电脑核心数
         int processors = Runtime.getRuntime().availableProcessors() / 2;
         //创建固定线程
         ExecutorService executorService = Executors.newFixedThreadPool(processors);
         //执行任务
-        //每次执行100条
+        //每次执行30条
         int bai = 30;
         //计算需要创建的线程数
         int threads = (int) Math.ceil((double) peopleIdList.size() / bai);
@@ -66,7 +72,13 @@ public class MethodGoodsTransitService {
             //多线程执行任务
             executorService.submit(() -> {
                 enterpriseList.forEach(item -> {
-                    //todo: 给边民发送短信
+                    //todo: 给边民发送短信,调用短信商接口API
+                    try {
+                        smsRetryService.sendSms(item.getPhone(), item.getCode().equals("null")? "666666" :item.getCode());
+                    } catch (Exception e) {
+                        System.out.println("异常被抓住了!");
+                        throw new RuntimeException(e);
+                    }
 
                 });
             });

+ 1 - 1
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/TbGoodsTransitService.java

@@ -223,7 +223,7 @@ public class TbGoodsTransitService extends ServiceImpl<TbGoodsTransitMapper, TbG
 	 * 下单后会向组内边民发送短信,
 	 * 通知其登录APP进行交易确认。
 	 */
-	public boolean purchaseLevelOntGoodsTransit(PurchaseLevelOneGoodsTransitParam purchaseLevelOntGoodsTransitParam){
+	public boolean purchaseLevelOntGoodsTransit(PurchaseLevelOneGoodsTransitParam purchaseLevelOntGoodsTransitParam) throws Exception {
 		//检查登录
 //		StpUtil.checkLogin();
 		//获取当前登陆人

+ 35 - 0
sp-service/level-one-server/src/main/java/com/pj/tb_goods_transit/retry/SmsRetryService.java

@@ -0,0 +1,35 @@
+package com.pj.tb_goods_transit.retry;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.retry.annotation.Backoff;
+import org.springframework.retry.annotation.Recover;
+import org.springframework.retry.annotation.Retryable;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.logging.Logger;
+
+/**
+ * @Author Mechrevo
+ * @Date 2023 07 31 14 43
+ **/
+@Service
+@Slf4j
+public class SmsRetryService {
+
+
+    @Async
+    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
+    public boolean sendSms(String phone,String code) throws Exception {
+        //模拟发送失败
+        throw new Exception("模拟短信发送失败!");
+    }
+
+
+    //最终补偿机制
+    @Recover
+    public void recover(){
+        log.error("发送短信失败!");
+    }
+
+}