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

时间:2018-12-18 13:42:00

标签: java spring rest

我正在创建一个应用程序,其中两个玩家应该有机会在编写代码方面相互竞争。

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

{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的玩家都调用它,然后用任务说明通知他们。

我希望他们使用一个代码计时器在一个会话中编写代码。 请建议我该怎么做

2 个答案:

答案 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")

如有任何问题,请告知