我正在创建一个应用程序,其中两个参与者应该有机会在编写代码时相互竞争。
例如,目前一个玩家可以启动会话创建:
@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发送给用户二
用户二将调用connect
API。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")
如果有任何问题,请通知