Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.exp.components.retry.impl;
- import com.exp.components.entity.Message;
- import com.exp.components.retry.Retrier;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import java.util.List;
- import java.util.UUID;
- import java.util.concurrent.ConcurrentHashMap;
- import java.util.function.Function;
- import java.util.stream.Collectors;
- public class SenderRetrier implements Retrier {
- private static final Logger LOG = LoggerFactory.getLogger(SenderRetrier.class);
- private ConcurrentHashMap<UUID, Message> pendingMessages;
- private ConcurrentHashMap<UUID, Integer> retryMap;
- private int maxRetries;
- public SenderRetrier(int maxRetries) {
- this.maxRetries = maxRetries;
- this.pendingMessages = new ConcurrentHashMap<>();
- this.retryMap = new ConcurrentHashMap<>();
- }
- @Override
- public Message retry(UUID msgId) {
- Message message = pendingMessages.get(msgId);
- if (message == null) {
- return null;
- }
- Integer retryNum = retryMap.get(msgId);
- if (retryNum >= maxRetries) {
- LOG.info("Reached max retries: {}, assume message: {} is poison", retryNum, msgId);
- deletePendingMessage(msgId);
- return null;
- }
- LOG.info("Try resend message: {}, current retries: {}", msgId, retryNum);
- retryMap.replace(msgId, ++retryNum);
- return message;
- }
- @Override
- public void deletePendingMessage(UUID msgId) {
- pendingMessages.remove(msgId);
- retryMap.remove(msgId);
- }
- @Override
- public void deletePendingMessages(List<UUID> uuidList) {
- uuidList.forEach(id -> {
- pendingMessages.remove(id);
- retryMap.remove(id);
- });
- }
- @Override
- public void addPendingMessages(List<Message> messages) {
- pendingMessages.putAll(messages.stream().collect(Collectors.toMap(Message::getId, Function.identity())));
- retryMap.putAll(messages.stream().collect(Collectors.toMap(Message::getId, m -> 1)));
- }
- @Override
- public void addPendingMessage(Message message) {
- pendingMessages.put(message.getId(), message);
- retryMap.put(message.getId(), 1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement