redis 加锁

来源:互联网 发布:淘宝评论专业配图 编辑:程序博客网 时间:2024/05/19 23:27
package com.fuwo.b3d.order.service;import com.fuwo.b3d.common.RestResult;import com.fuwo.b3d.enums.StatusEnum;import com.fuwo.b3d.model.model.Model;import com.fuwo.b3d.model.model.ModelPack;import com.fuwo.b3d.model.service.repository.ModelPackRepository;import com.fuwo.b3d.model.service.repository.ModelRepository;import com.fuwo.b3d.order.model.Order;import com.fuwo.b3d.order.service.repository.OrderRepository;import com.fuwo.b3d.user.model.UserInfo;import com.fuwo.b3d.user.model.UserModel;import com.fuwo.b3d.user.service.repository.UserInfoRepository;import com.fuwo.b3d.user.service.repository.UserModelRepository;import net.sf.json.JSONObject;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.RuntimeBeanNameReference;import org.springframework.cache.annotation.CacheConfig;import org.springframework.data.domain.Example;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.stereotype.Service;import org.springframework.util.Assert;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;import sun.rmi.transport.ObjectTable;import javax.transaction.Transactional;import java.util.ArrayList;import java.util.List;import java.util.UUID;import java.util.concurrent.TimeUnit;@CacheConfig(cacheNames = "com.fuwo.b3d.orders")@Transactional@Servicepublic class OrderServiceImpl implements OrderService {    @Autowired    private OrderRepository orderRepository;    @Autowired    private UserModelRepository userModelRepository;    @Autowired    private UserInfoRepository userInfoRepository;    @Autowired    private ClientHttpRequestFactory clientHttpRequestFactory;    @Autowired    private RedisTemplate redisTemplate;    @Autowired    private ModelPackRepository modelPackRepository;    @Autowired    private ModelRepository modelRepository;    private static final String PAY_URL = "http://192.168.2.221/fcoin/trade/";    private static String LOCK_KEY = "redis_lock_%s_%s";    @Override    public Page<Order> pageQuery(Example<Order> example, Pageable pageable) {        Assert.notNull(example);        Assert.notNull(pageable);        return orderRepository.findAll(example, pageable);    }    @Override    public Order save(Order order) {        Assert.notNull(order);        return orderRepository.save(order);    }    @Override    public Order findByNo(String no) {        Assert.notNull(no);        return orderRepository.findByNo(no);    }    @Override    public RestResult pay(Order order) {        Assert.notNull(order);        RestResult restResult = new RestResult();        String no = order.getNo();        String type = StringUtils.substring(no, 24, 26);        String pk = StringUtils.substring(no, 26, 36);        if (order.getState() == Order.OrderStatusEnum.SUCCESS) {            restResult.setCode(RestResult.ResultCodeEnum.ORDER_PAYED.getCode());            restResult.setMsg(RestResult.ResultCodeEnum.ORDER_PAYED.getDesc());            return restResult;        }        String key = String.format(LOCK_KEY, order.getUserInfo().getId(), type + pk);        String value = String.valueOf(System.currentTimeMillis());        JSONObject json = null;        boolean lock = false;        String createTime = redisTemplate.opsForValue().get(key).toString();        if (StringUtils.isNotBlank(createTime)) {            //查看锁是否过期            long currentTime = System.currentTimeMillis();            //存活时间            long existTime = currentTime - Long.valueOf(createTime);            if (existTime > 3 * 60 * 1000) {                //超过三分钟,删除                redisTemplate.delete(key);            }        }        RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();        try {            lock = redisConnection.setNX(key.getBytes(), value.getBytes());            if (!lock) {                restResult.setCode(RestResult.ResultCodeEnum.DUPLICATE_REQUEST.getCode());                restResult.setMsg(RestResult.ResultCodeEnum.DUPLICATE_REQUEST.getDesc());                return restResult;            }            RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);            MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();            params.set("uid", order.getUserInfo().getId());            params.set("amount", order.getAmount() * (-1));//扣减            params.set("deal_type", "8");            params.set("remark", order.getDealType().getDesc());            json = restTemplate.postForEntity(PAY_URL, params, JSONObject.class).getBody();            if (json == null) {                restResult.setCode(RestResult.ResultCodeEnum.ERROR.getCode());                restResult.setMsg(RestResult.ResultCodeEnum.ERROR.getDesc());            } else {                String code = json.getString("code");                String msg = json.getString("msg");                if (StringUtils.equals(RestResult.ResultCodeEnum.SUCC.getCode(), code)) {                    //扣款成功,处理业务数据                    dealOrder(restResult, order);                    if (!StringUtils.equals(RestResult.ResultCodeEnum.SUCC.getCode(), restResult.getCode())) {                        throw new RuntimeException("付款成功 ,购买失败:" + restResult.getMsg());                    }                } else {                    restResult.setCode(code);                    restResult.setMsg(msg);                }            }        } catch (Exception e) {            restResult.setCode(RestResult.ResultCodeEnum.ERROR.getCode());            restResult.setMsg(RestResult.ResultCodeEnum.ERROR.getDesc() + e.getMessage());        } finally {            if (StringUtils.equals(redisTemplate.opsForValue().get(key).toString(), value)) {                redisTemplate.delete(key);            }        }        return restResult;    }    private void dealOrder(RestResult restResult, Order order) {        String id = StringUtils.substring(order.getNo(), 26, 36);        UserInfo userInfo = null;        switch (order.getDealType()) {            case MODELPACK:                ModelPack modelPack = modelPackRepository.findOne(Long.valueOf(id));                if (modelPack == null) {                    restResult.setCode(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getCode());                    restResult.setMsg(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getDesc());                    return;                }                List<ModelPack> modelPacks = order.getUserInfo().getModelPacks();                if (modelPacks == null) {                    modelPacks = new ArrayList<>();                }                modelPacks.add(modelPack);                userInfo = order.getUserInfo();                userInfo.setModelPacks(modelPacks);                //获取模型下的模型包                List<Model> packModels = modelPack.getModels();                List<Model> userModels = userInfo.getModels();                userModels.addAll(packModels);                userInfo.setModels(userModels);                userInfoRepository.save(userInfo);                break;            case MODEL:                Model model = modelRepository.findOne(Integer.valueOf(id));                if (model == null) {                    restResult.setCode(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getCode());                    restResult.setMsg(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getDesc());                    return;                }              /*  UserModel userModel = new UserModel();                userModel.setModelId(model.getId());                userModel.setStatus(StatusEnum.ENABLE);                userModel.setUid(order.getUid());                userModelRepository.save(userModel);*/                userInfo = order.getUserInfo();                List<Model> current = userInfo.getModels();                if (current == null) {                    current = new ArrayList<>();                }                current.add(model);                userInfo.setModels(current);                userInfoRepository.save(userInfo);                break;        }        order.setState(Order.OrderStatusEnum.SUCCESS);        orderRepository.save(order);        restResult.setCode(RestResult.ResultCodeEnum.SUCC.getCode());        restResult.setMsg(RestResult.ResultCodeEnum.SUCC.getDesc());    }    @Override    public Page<Order> findAll(Example<Order> example, Pageable pageable) {        Assert.notNull(example);        Assert.notNull(pageable);        return orderRepository.findAll(example, pageable);    }}
原创粉丝点击