Синхронизировать конечную точку REST для ожидания двух вызовов с одним и тем же параметром - PullRequest
0 голосов
/ 18 декабря 2018

Я создаю приложение, в котором два игрока должны иметь возможность конкурировать друг с другом в написании кода.

Например, на данный момент один игрок может инициировать создание сеанса:

@PostMapping("/prepareSession")
    public UUID prepareSession(@RequestParam("taskName") String taskName) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String currentPrincipalName = authentication.getName();
        User playerOne = userService.findOne(currentPrincipalName);
        Task task = taskService.findOne(taskName);
        UUID sessionId = UUID.randomUUID();
        sessionService.save(new Session(sessionId, playerOne, null, task));
        return sessionId;
    }

Затем этот идентификатор сеанса он должен отправить игроку, с которым он хочет соревноваться.А затем второй игрок вводит sessionId и получает описание задачи.

@GetMapping("/connect")
    public Task connect(@RequestParam("sessionId") String sessionId) throws InterruptedException {

        Session session = sessionService.findOne(sessionId);

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String currentPrincipalName = authentication.getName();
        User playerSecond = userService.findOne(currentPrincipalName);
        session.setPlayerSecond(playerSecond);
        sessionService.save(session);
        return session.getTask();
    }

Интересно, как заставить остальную конечную точку ждать, пока оба игрока с одинаковым sessionId не вызовут ее, а затем уведомить их с описанием задачи.

Я хочу, чтобы они написали код в течение одного сеанса с одним таймером кода.Подскажите пожалуйста как мне это сделать

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

укажите этот код для обоих методов, пожалуйста, импортируйте пружинную транснациональную банку

 @Transactional(propagation =Propagation.REQUIRED,isolation=Isolation.SERIALIZABLE,readOnly=false,transactionManager="transactionManager")

, если возникнет проблема, сообщите

0 голосов
/ 18 декабря 2018

То, что вы ищете, может быть достигнуто следующим образом

Вы можете использовать результат DeferredResult и сохранять его на карте до тех пор, пока пользователь с таким же sessionId не присоединится.Например,

Map<String, DeferredResult<ResponseEntity<?>>> unconnected = new HashMap<String, DeferredResult<ResponseEntity<?>>>();

Пользователь может вызвать соединение prepareSessionAPI для получения sessionId

Пользователь затем вызовет API соединения.API-интерфейс connet будет хранить этот запрос / отложенный результат в хэш-карте, пока пользователь 2 не присоединится.Пример

DeferredResult<Task> unconnectedTask = new DeferredResult<Task>();
unconnected.put(sessionId, unconnectedTask);

Теперь запрос пользователя будет храниться в карте памяти до тех пор, пока пользователь два не присоединится

Пользователь один отправит sessionId пользователю два

Пользователь двавызовет connect API.API подключения будет искать сеанс в HashMap, и если он существует, он будет выполнять необходимые операции, а затем устанавливать результат отложенного результата.Пример

DeferredResult<Task> unconnectedTask = unconnected.get(sessionId);

if(unconnectedTask != null) {
    // Do work
    unconnectedTask.setResult(task);
} else {
  // This is user one's request
}

Обратите внимание, это псевдокод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...