1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class RetryListener { private static final Logger log = LoggerFactory.getLogger(RetryListener.class);
private static final String RETRY_KEY_ZSET = "_retry_key"; private static final String RETRY_VALUE_MAP = "_retry_value"; @Autowired private RedisTemplate<String,Object> redisTemplate; @Autowired private KafkaTemplate<String, String> kafkaTemplate;
@KafkaListener(topics = "${spring.kafka.topics.retry}") public void consume(List<ConsumerRecord<String, String>> list) { for(ConsumerRecord<String, String> record : list){ KafkaRetryRecord retryRecord = JSON.parseObject(record.value(), KafkaRetryRecord.class);
String key = UUID.randomUUID().toString(); redisTemplate.opsForHash().put(RETRY_VALUE_MAP, key, record.value()); redisTemplate.opsForZSet().add(RETRY_KEY_ZSET, key, retryRecord.getNextTime()); } }
@Scheduled(cron="0/2 * * * * *") public void retryFormRedis() { long currentTime = System.currentTimeMillis(); Set<ZSetOperations.TypedTuple<Object>> typedTuples = redisTemplate.opsForZSet().reverseRangeByScoreWithScores(RETRY_KEY_ZSET, 0, currentTime); redisTemplate.opsForZSet().removeRangeByScore(RETRY_KEY_ZSET, 0, currentTime); for(ZSetOperations.TypedTuple<Object> tuple : typedTuples){ String key = tuple.getValue().toString(); String value = redisTemplate.opsForHash().get(RETRY_VALUE_MAP, key).toString(); redisTemplate.opsForHash().delete(RETRY_VALUE_MAP, key); KafkaRetryRecord retryRecord = JSON.parseObject(value, KafkaRetryRecord.class); ProducerRecord record = retryRecord.parse(); kafkaTemplate.send(record); } } }
|