Practical use of multithreading

Business logic: remove the id of the deviceUid box from redis. If not, insert it into redis; otherwise, it cannot be inserted

@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);//共享变量的写操作
}

Scenario 2: Reduce the number of 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;
	}
	
}

Asynchronous processing callback log

@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();
    }
}

 

 

Guess you like

Origin blog.csdn.net/qq_24271537/article/details/109699612