マルチスレッドの実用化

ビジネスロジック:redisからdeviceUidボックスのIDを削除します。そうでない場合は、redisに挿入します。そうでない場合は挿入できません。

@Controller
@RequestMapping("/miniapp/rent")
public class DeviceRentController extends BaseController{
   private Logger logger = LoggerFactory.getLogger(DeviceRentController.class);
   private static final String LOGINFO="[DeviceRentController服务]:";
   @Autowired
   private ShareDeviceMapper shareDeviceMapper;
   @Autowired
   private RedisCacheService redisCacheService;

String deviceUid=shareRentRecord.getDeviceUid();
Integer boxId=shareRentRecord.getBoxId();
//多线程,对共享变量,的写操作,不具有原子性
synchronized (this) { // 原子性 ;
   Integer useBox=redisCacheService.getSerializer("ShareBoxIdUse:"+deviceUid, Integer.class);
   if(useBox!=null&&boxId==useBox){
      return new JsonResponse<>(-1, "该车辆已经被租借");
   }
   redisCacheService.setSerializer("ShareBoxIdUse:"+deviceUid, boxId,10L);//共享变量的写操作
}

シナリオ2:SMSの数を減らす

减少短信条数(并发问题待分布式锁处理,暂时用单例锁)
synchronized (LockObjectManage.getLockObject(String.valueOf(smsMarket.getMarketId()))) {
   rest=rest-smsCostCount;
}
public class LockObjectManage implements Serializable{
	
	private static Map<String, LockObject> lockObjMap=new ConcurrentHashMap<String, LockObject>();
	
	public static LockObject getLockObject(String lockStr){
		LockObject obj=lockObjMap.get(lockStr);
		if(obj==null){
			obj=new LockObject(lockStr);
			lockObjMap.put(lockStr, obj);
		}
		return obj;
	}
	
}
public class LockObject implements Serializable{
	private String lockStr;
	
	public LockObject(String lockStr) {
		super();
		this.lockStr = lockStr;
	}

	public String getLockStr() {
		return lockStr;
	}

	public void setLockStr(String lockStr) {
		this.lockStr = lockStr;
	}
	
}

非同期処理のコールバックログ

@Resource
private TaskExecutor taskExecutor ;

 

@RequestMapping (値= "aliNotifyUrl" 方法= RequestMethod。POST
公共ボイドaliNotifyUrl(HttpServletRequestのリクエスト、HttpServletResponseの応答){
   
試み{         文字列jsonStr = JSON。toJSONString(request.getParameterMap());

       
logger .info("支付宝支付闘回调方法:" + jsonStr);
       
if"TRADE_SUCCESS" .equals(request.getParameter("trade_status"))){             String payTradeNo = request.getParameter(
"passback_params");
           
taskExecutorRunnableを(){
               
@Override
               
ます。public void実行(){                    afterPay(定数です。
PAY_TYPE_ALIPAY、定数です。PAY_STATUS_PAY_SUCCESSpayTradeNo jsonStr )。
                }
            });
        }
        response.setContentType(
"text / html; charset = utf-8");
        response.getWriter()。write(
"success");
        response.getWriter()。flush();
    }
catch(Exception e){
       
logger .error("阿里️支付回调失败"、e);
    }
}

 

private void afterPay(String payType、String payStatus、String payTradeNo、String resultXml){
   
logger .info("启PIN単独線程開起的理订単详蒙、payTradeNo =" + payTradeNo);
    MarketTradeOrder marketTradeOrder =
new MarketTradeOrder();
    marketTradeOrder.setPayTradeNo(payTradeNo);
    List <MarketTradeOrder> list =
marketTradeOrderService .getList(marketTradeOrder);
   
if(list!= null && list.size()> 0 ){         marketTradeOrder = list.get(
0 );
        marketTradeOrder.setOrderDetail(XStreamFactoryUtil。XmlToBean(marketTradeOrder.getXmlOrderDetail()、OrderDetail。
クラス))。
    }
else {
       
logger .info("订単不存在");
       
戻る;
    }
    String orderStatus = marketTradeOrder.getOrderStatus();
   
if(定数。PAY_STATUS_PAY_SUCCESS.equals(payStatus)){         orderStatus =定数。
ORDER_STATUS_PAY ;
    }
   
redisCacheService .setSerializer(redis_prefix_pay_status + marketTradeOrder.getMarketId()+ ":" + marketTradeOrder.getTradeNo()、payStatus、600L );
    MarketTradeOrder m =
new MarketTradeOrder();
    m.setMarketId(marketTradeOrder.getMarketId());
    m.setTradeId(marketTradeOrder.getTradeId());
    m.setUptime(
new Date());
    m.setXmlPayResultInfo(resultXml);
    m.setPayStatus(payStatus);
    m.setOrderStatus(orderStatus);
    m.setPayType(payType);
    m.setPayTime(
new Date());
   
marketTradeOrderService.updateByPrimaryKeySelective(m);
   
//最易出错信息放置最后处理
   
marketTradeOrder = marketTradeOrderService.getFmTradeOrder(marketTradeOrder.getTradeId());
    afterPaySuccessDeal(marketTradeOrder);
    sendPlatformMsg(marketTradeOrder);
   
try {
        MarketData marketData =
new MarketData();
        marketData.setId(marketTradeOrder.getMarketId());
       
if(marketTradeOrder.getOrderDetail()!=null && marketTradeOrder.getOrderDetail().getMarketAddress() != null){
            List<MarketData> mList = 
marketService.findMarketList(marketData);
           
platformExService.createContract(mList.get(0),marketTradeOrder,true);
        }
    }
catch (MarketDaoException e) {
        e.printStackTrace();
    }
}

 

 

おすすめ

転載: blog.csdn.net/qq_24271537/article/details/109699612