package cn.exrick.xboot.your; import cn.exrick.xboot.core.common.annotation.RateLimiter; import cn.exrick.xboot.core.common.lock.Callback; import cn.exrick.xboot.core.common.lock.RedisLockTemplate; import cn.exrick.xboot.core.common.utils.ResultUtil; import cn.exrick.xboot.core.common.vo.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import java.util.concurrent.TimeUnit; /** * @author Exrickx */ @Slf4j @Controller @Api(tags = "测试接口") @Transactional @RequestMapping(value = "/xboot/test") public class TestController { @Autowired private RedisLockTemplate redisLockTemplate; @RequestMapping(value = "/lockAndLimit", method = RequestMethod.GET) @RateLimiter(rate = 1, rateInterval = 5000) @ApiOperation(value = "同步锁限流测试") @ResponseBody public Result test() { redisLockTemplate.execute("订单流水号", 3, null, TimeUnit.SECONDS, new Callback() { @Override public Object onGetLock() { // TODO 获得锁后要做的事 log.info("生成订单流水号"); return null; } @Override public Object onTimeout() { // TODO 未获取到锁(获取锁超时)后要做的事 log.info("oops 没拿到锁"); return null; } }); return ResultUtil.data(null); } }