一、如何保证消息被重复消费.如何保证消息的幂等性
1.首先我们要对增量数据库设置主键id.
2.保证数据的幂等性.使用redis对相同的数据进行加锁.
3.为了保证数据的最新.我们需要判断修改的时间
@RocketMQMessageListener( nameServer = "${rocketmq.name-server}", consumerGroup = "${rocket.consumer-group}", topic = "${rocket.topic-string}", consumeMode = ConsumeMode.ORDERLY) @Component @Slf4j public class RocketMQConsumer implements RocketMQListener<String> { @Autowired private UserInfoViewManager userInfoViewManager; @Autowired private StringRedisTemplate redisTemplate; @Override public void onMessage(String message) { log.info("消费字符串消息:" + message); UserInfoViewParam userInfoViewParam = GsonUtils.getObject(message, UserInfoViewParam.class); UserInfoView userInfoView = new UserInfoView(); Integer userId = null; Long gmtModified = null; if (userInfoViewParam != null) { try { userId =userInfoViewParam.getUserId(); gmtModified = userInfoViewParam.getGmtModified(); userInfoView.setGmtCreate(new Date(userInfoViewParam.getGmtCreated())).setGmtModified(new Date(gmtModified)).setId(userId) .setNick(userInfoViewParam.getNick()).setStatus(userInfoViewParam.getStatus()); } catch (Exception e) { log.info("数据异常!"); } } if (userId == null) { return; } Boolean flag = redisTemplate.opsForValue().setIfAbsent("bi-admin-rocketmq-consumer-" + userId.toString(),userId.toString(),10L, TimeUnit.SECONDS); if (flag){ try { Integer id = userInfoView.getId(); QueryWrapper<UserInfoView> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", id); UserInfoView infoView = userInfoViewManager.getBaseMapper().selectOne(queryWrapper); if (infoView != null) { if (infoView.getGmtModified().getTime() < gmtModified){ userInfoViewManager.update(userInfoView, queryWrapper); } } else { userInfoViewManager.save(userInfoView); } } catch (Exception e) { log.info("更新异常!"); } finally { if (userId.toString().equals(redisTemplate.opsForValue().get("bi-admin-rocketmq-consumer-" + userId.toString()))){ redisTemplate.delete("bi-admin-rocketmq-consumer-" + userId.toString()); } } } } }