代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Riznyk

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

  •  1
  • Oleksandr Riznyk  · 技术社区  · 6 年前

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

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

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

    然后,这个会话id他需要发送给他想参加比赛的球员。 然后第二个播放器输入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的两个播放器调用它,然后用任务描述通知它们。

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   avishka eranga    6 年前

    把这两个方法的代码, 请进口弹簧跨国罐

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

    如有任何问题,请通知

        2
  •  0
  •   Markus Pscheidt WEGSY85    6 年前

    你要找的就是这样

    可以使用deferredresult结果并将其存储在映射中,直到具有相同sessionid的用户加入。前任

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

    用户一将调用连接 prepareSessionAPI 接收sessionid

    然后用户一调用connect api。connet api将把这个请求/定义的结果存储在hashmap中,直到用户2加入。前任

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

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

    用户1将sessionid发送给用户2

    用户2将调用 connect 应用程序编程接口。connect api将在 HashMap ,如果它存在,它将执行所需的操作,然后设置延迟结果的结果。前任

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

    请注意,这是伪代码。