// Copyright © 2015 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.core.service;
import fi.hsl.parkandride.core.back.RequestLogRepository;
import fi.hsl.parkandride.core.domain.RequestLogKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.LongAdder;
import static java.util.stream.Collectors.toMap;
public class BatchingRequestLogService {
private static final Logger logger = LoggerFactory.getLogger(BatchingRequestLogService.class);
private Map<RequestLogKey, LongAdder> requestLogBatch = new ConcurrentHashMap<>();
private final RequestLogRepository requestLogRepository;
public BatchingRequestLogService(RequestLogRepository requestLogRepository) {
this.requestLogRepository = requestLogRepository;
}
public void increment(RequestLogKey key) {
final RequestLogKey roundedTimestamp = key.roundTimestampDown();
requestLogBatch.computeIfAbsent(roundedTimestamp, k -> new LongAdder()).increment();
}
@Scheduled(cron = "${requestlog.cron:0 */5 * * * *}")
public void updateRequestLogs() {
logger.info("Update request logs");
final Map<RequestLogKey, LongAdder> previousMap = this.requestLogBatch;
clearLogStash();
final Map<RequestLogKey, Long> requestCounts = previousMap.keySet().stream()
.collect(toMap(
key -> key,
key -> previousMap.get(key).sum()
));
requestLogRepository.batchIncrement(requestCounts);
}
public void clearLogStash() {
requestLogBatch = new ConcurrentHashMap<>();
}
}