Sobes.tech
Junior — Senior
46

Сервис расчётов с транзакцией и логикой повторных попыток

Компании, где спрашивали:

Альфа-БанкАльфа-Банк
Условие задачи

Проведение код‑ревью метода, который получает данные, вычисляет финансовый показатель, сохраняет его в репозиторий и отправляет уведомление. Метод реализован внутри транзакции и содержит цикл повторных попыток получения данных.

@Component
public class CalculateService {

    @Autowired
    private FileInfoService fileInfoService;

    @Autowired
    private SaveRepository saveRepository;

    @Autowired
    private Notification notification;

    private static final int MAX_ATTEMPTS = 3;

    @Transactional
    public void calculation(GetFilesInfoRequest request) {
        int attempts = 0;
        double totalCount = 0;
        double divisor = 6.85;
        double commissionRate = 5.2534;

        while (attempts < MAX_ATTEMPTS) {
            SendForNotify fileInfo = fileInfoService.getFilesInfo(request);
            if (fileInfo != null) {
                totalCount = fileInfo.getCount();
                break;
            }
        }

        double result = (totalCount * commissionRate) / divisor;
        saveRepository.save(result);

        try {
            notification.sendCalculate(result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}