ビジネスロジック: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");
taskExecutor。Runnableを(){
@Override
ます。public void実行(){ afterPay(定数です。
PAY_TYPE_ALIPAY、定数です。PAY_STATUS_PAY_SUCCESS、payTradeNo 、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();
}
}