同步REST端点以等待具有相同参数的2个调用



我正在创建一个应用程序,其中两个参与者应该有机会在编写代码时相互竞争。

例如,目前一个玩家可以启动会话创建:

@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();
}

我想知道如何让rest端点等待具有相同sessionId的两个玩家调用它,然后用任务描述通知他们。

我希望他们在一个会话中编写代码,并使用一个代码计时器。请建议我应该如何进行

您想要的东西可以像这个一样实现

您可以使用DeferredResult结果并将其存储在映射中,直到具有相同sessionId的用户加入为止。Ex

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

用户一将呼叫连接prepareSessionAPI以接收sessionId

用户一将调用connect API。connet-api将把这个请求/defferred结果存储在hashmap中,直到用户2加入。Ex

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

现在,用户一的请求将存储在内存映射中,直到用户二加入

用户一会将sessionId发送给用户二

用户二将调用connectAPI。connect API将在HashMap中查找会话,如果会话存在,它将执行所需的操作,然后设置延迟结果的结果。Ex

DeferredResult<Task> unconnectedTask = unconnected.get(sessionId);
if(unconnectedTask != null) {
// Do work
unconnectedTask.setResult(task);
} else {
// This is user one's request
}

请注意,这是伪代码。

把这两个代码都放在方法中,请进口弹簧跨国罐

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

如果有任何问题,请通知

最新更新