在新增任务单,自动生成任务单号时,会根据一定的规则在原有的公司任务单号基础上,数值加一。在公司业务流程中一般来说是没有问题的,因为在公司中任务单的并发量很小。但是在压力测试中就会报任务单号重复的错误,一般流程中报错也没什么,但是压力测试就做不下去了。解决方案可以加锁,但是redis有另一个方案可以实现。
@Resource
ProduceTaskDao produceTaskDao;
@Resource(name = "redisTemplate")
RedisTemplate<String, String> redis;
private String generateTaskNo(String companyId, BaseCompanyModel company) {
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
String suffix = company.getCode() + "-" + sdf.format(new Date());
Integer max = produceTaskDao.findMaxTaskNumBySuffix(suffix, companyId);
if (max == null)
max = 0;
max += 1;
while(!redis.opsForValue().setIfAbsent(suffix + String.format("%04d", max), "")) {
max += 1;
}
String planNo = suffix + String.format("%04d", max);
return planNo;
}
setIfAbsent方法,当redis的key不存在时才会创建,返回值boolean,创建成功返回true,反之返回false。只要生成一个任务单号,就会占用一个redis,能够保证任务单号不重复而不需要加锁。缺点是如果创建任务单抛出异常事务回滚,那么任务单号就会不连续。