MQ消息内容去重消费解决方案

今天写一个小儿科的MQ消息内容去重消费解决方案,思路如下:

1.在消息体中定义消息的唯一索引字段uniqueId

   private String uniqueId;

2.重写uniqueId字段的get方法给uniqueId赋值,具体生成uniqueId值算法根据系统业务需求而定

   比如:

    public String getUniqueId() {
        StringBuffer columnAppend = new StringBuffer().append(wechatGroupId).append(wechatId)
                .append(requirements).append(type).append(isTransOrder).append(startAddress)
                .append(endAddress).append(orderNums);
        return FileUtil.getMd5(columnAppend.toString().getBytes());

    }

    FileUtil.getMd5方法内容如下:

    public static String getMd5(byte[] bytes) {
        // 16进制字符
        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(bytes);
            byte[] md = mdTemp.digest();
            int j = md.length;
            char[] str = new char[j * 2];
            int k = 0;
            // 移位 输出字符串
            for (byte byte0 : md) {
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

3.MQ消费者端,当有重复消息来临时就可以过滤掉了

    String redisKey = MQ_MESSAGE_KEY + data.getUniqueId();
    if (redisUtils.hasKey(redisKey)){
          continue;
     }
     redisUtils.set((redisKey), "MQ_MESSAGE_VALUE", MQ_MESSAGE_EXPIRE);

   

猜你喜欢

转载自blog.csdn.net/weixin_39352976/article/details/109994589