业务逻辑:从redis中取出deviceUid的box的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:减少短信条数
减少短信条数(并发问题待分布式锁处理,暂时用单例锁)
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(value = "aliNotifyUrl",method= RequestMethod.POST)
public void aliNotifyUrl(HttpServletRequest request,HttpServletResponse response){
try {
String jsonStr = JSON.toJSONString(request.getParameterMap());
logger.info("支付宝支付成功回调方法: "+jsonStr);
if("TRADE_SUCCESS".equals(request.getParameter("trade_status"))){
String payTradeNo = request.getParameter("passback_params");
taskExecutor.execute(new Runnable() {
@Override
public void run() {
afterPay(Constant.PAY_TYPE_ALIPAY,Constant.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("启动单独线程开始处理订单详细,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.class));
}else{
logger.info("订单不存在");
return;
}
String orderStatus = marketTradeOrder.getOrderStatus();
if(Constant.PAY_STATUS_PAY_SUCCESS.equals(payStatus)){
orderStatus = Constant.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();
}
}