今天写一个小儿科的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);