我正在创建一个应用程序,其中两个玩家应该有机会在编写代码方面相互竞争。
例如,现在一个玩家可以启动会话创建:
{offersList.length ? (
// html markup with results
) : (
// html markup if no results
)}
然后,他需要将此会话ID发送给他想竞争的玩家。 然后第二位玩家输入sessionId并获得任务描述。
@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的玩家都调用它,然后用任务说明通知他们。
我希望他们使用一个代码计时器在一个会话中编写代码。 请建议我该怎么做
答案 0 :(得分:0)
您正在寻找的东西可以通过这种方式实现
您可以使用DeferredResult结果并将其存储在地图中,直到具有相同sessionId的用户加入为止。例如
Map<String, DeferredResult<ResponseEntity<?>>> unconnected = new HashMap<String, DeferredResult<ResponseEntity<?>>>();
用户将调用连接prepareSessionAPI
来接收sessionId
然后,用户一个将调用connect API。 connet api会将请求/延迟结果存储在哈希图中,直到用户2加入为止。例如
DeferredResult<Task> unconnectedTask = new DeferredResult<Task>();
unconnected.put(sessionId, unconnectedTask);
现在,用户的请求将存储在内存映射中,直到用户2加入为止
用户一会将sessionId发送给用户二
用户二将调用connect
API。 connect API将在HashMap
中查找会话,如果存在,它将执行所需的操作,然后设置延迟结果。例如
DeferredResult<Task> unconnectedTask = unconnected.get(sessionId);
if(unconnectedTask != null) {
// Do work
unconnectedTask.setResult(task);
} else {
// This is user one's request
}
请注意,这是伪代码。
答案 1 :(得分:0)
将这两种方法的代码都放入, 请进口春季跨国罐子
@Transactional(propagation =Propagation.REQUIRED,isolation=Isolation.SERIALIZABLE,readOnly=false,transactionManager="transactionManager")
如有任何问题,请告知