构建这个并发问题的正确方法是什么?弹簧套



我正在使用Spring Boot构建一个非常简单的游戏。游戏需要的功能之一是能够同时处理多个游戏。

所以在我的控制器中,我有这些方法。

@Controller
@EnableAutoConfiguration
public class GameController {
private final GameService gameService;
@Autowired
public GameController(final GameService gameService) {
this.gameService = gameService;
}
@RequestMapping("/createGame")
@ResponseBody
public String createGameController(@RequestParam(value = 
"playerName") final List<String> playerNames) {
final String gameId = gameService.createGameAndGenerateGameId(playerNames);
return "Your gameId is = " + gameId + " n Give this to other users to  
challenge!";
}

因此,上面的这个方法只负责创建一个游戏并返回每个游戏唯一的"gameId"。我希望每个请求都会返回一个新的游戏ID。目前的情况是,每个请求都"共享"相同的游戏ID。

我知道这可以通过为每个请求手动实现新线程来解决,但有没有一种春天的方法可以做到这一点?

@RequestMapping("/startGame")
@ResponseBody
public String startGameController(@RequestParam(value = 
"gameId") 
final String gameId) {
return gameService.startGame(gameId);
}

另一个特点。因此,当我的用户想要在游戏中执行动作时,他们有一个指定游戏的特定游戏ID。现在,如果有多个线程包含单独的游戏。如何将特定的gameId映射到线程中的特定游戏?

示例:

有3个游戏在三个不同的线程上运行。

游戏1/线程1:id=123

游戏2/线程2:id=321

游戏3/线程3:id=213

客户端1发送/启动游戏?游戏ID=321

如何指定客户端1对游戏2/线程2的请求?弹簧有这个功能吗?还是必须在没有弹簧的情况下完成?

感谢阅读。

默认情况下,每个请求都在单独的线程中执行。我假设,对于每个新游戏,你都会通过增加计数器来创建游戏id。为了确保线程安全,请使用AtomicLong,或者创建UUID而不是数字ID。

关于第二部分,没有类似的内置。为什么每个游戏都需要在一个单独的线程中运行?

最新更新