Войти Регистрация
Конкурентность

17. ThreadLocal в пуле обработки переводов

Средняя

Java · 40 строк

Переводы выполняются в пуле из 32 потоков. Для клиентских переводов clientId известен, для системных — автоплатежей и погашения кредита — он равен null. Аудит берёт клиента из RequestContext.

Отметьте строки с ошибками.

В работе: Журнал аудита операций для службы безопасности банка.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
ThreadLocalпул потоковremoveисключения в submit

Источник: на задачах Сбера: переводы и аудит операций. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;
  3. class RequestContext {
  4. private static final ThreadLocal<String> CLIENT_ID = new ThreadLocal<>();
  5. static void set(String clientId) {
  6. CLIENT_ID.set(clientId);
  7. }
  8. static String clientId() {
  9. return CLIENT_ID.get();
  10. }
  11. }
  12. public class TransferHandler {
  13. private final ExecutorService pool = Executors.newFixedThreadPool(32);
  14. private final Transfers transfers;
  15. private final AuditLog audit;
  16. public TransferHandler(Transfers transfers, AuditLog audit) {
  17. this.transfers = transfers;
  18. this.audit = audit;
  19. }
  20. // clientId == null — системный перевод: автоплатёж или погашение кредита.
  21. public void handle(String clientId, TransferRequest req) {
  22. pool.submit(() -> {
  23. if (clientId != null) {
  24. RequestContext.set(clientId);
  25. }
  26. transfers.execute(req);
  27. audit.write(RequestContext.clientId(), req);
  28. });
  29. }
  30. }
  31. interface Transfers { void execute(TransferRequest req); }
  32. interface AuditLog { void write(String clientId, TransferRequest req); }
  33. record TransferRequest(String fromAccount, String toAccount, long amountKop) {}