Java · 40 строк
Переводы выполняются в пуле из 32 потоков. Для клиентских переводов clientId известен, для системных — автоплатежей и погашения кредита — он равен null. Аудит берёт клиента из RequestContext.
Отметьте строки с ошибками.
В работе: Журнал аудита операций для службы безопасности банка.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: на задачах Сбера: переводы и аудит операций. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;class RequestContext {private static final ThreadLocal<String> CLIENT_ID = new ThreadLocal<>();static void set(String clientId) {CLIENT_ID.set(clientId);}static String clientId() {return CLIENT_ID.get();}}public class TransferHandler {private final ExecutorService pool = Executors.newFixedThreadPool(32);private final Transfers transfers;private final AuditLog audit;public TransferHandler(Transfers transfers, AuditLog audit) {this.transfers = transfers;this.audit = audit;}// clientId == null — системный перевод: автоплатёж или погашение кредита.public void handle(String clientId, TransferRequest req) {pool.submit(() -> {if (clientId != null) {RequestContext.set(clientId);}transfers.execute(req);audit.write(RequestContext.clientId(), req);});}}interface Transfers { void execute(TransferRequest req); }interface AuditLog { void write(String clientId, TransferRequest req); }record TransferRequest(String fromAccount, String toAccount, long amountKop) {}