Java 构建这个并发问题的正确方法是什么?弹簧靴
我正在使用Spring Boot构建一个非常简单的游戏。游戏需要的一个特性是能够同时处理多个游戏 所以在我的控制器中,我有这些方法Java 构建这个并发问题的正确方法是什么?弹簧靴,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我正在使用Spring Boot构建一个非常简单的游戏。游戏需要的一个特性是能够同时处理多个游戏 所以在我的控制器中,我有这些方法 @Controller @EnableAutoConfiguration public class GameController { private final GameService gameService; @Autowired public GameController(final GameService gameService) { this.gam
@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映射到线程中的特定游戏
例如:
有3个游戏在三个不同的线程上运行
游戏1/线程1:id=123
游戏2/线程2:id=321
游戏3/线程3:id=213
客户端1发送/startName?游戏ID=321
如何将客户端1请求指定给游戏2/线程2?spring是否为此提供了功能,还是必须在没有spring的情况下完成
谢谢你的阅读 默认情况下,每个请求都在单独的线程中执行。我假设对于每一个新游戏,您都通过增加计数器来创建游戏id。要使其线程安全,请使用
AtomicLong
或代替数字ID创建UUID
关于第二部分,没有类似的内置功能。为什么每个游戏都需要在单独的线程中运行?默认情况下,每个请求都在单独的线程中执行。我假设对于每一个新游戏,您都通过增加计数器来创建游戏id。要使其线程安全,请使用
AtomicLong
或代替数字ID创建UUID
关于第二部分,没有类似的内置功能。为什么每个游戏都需要在一个单独的线程中运行?我不知道你如何想象tbh上的工作流程。。。但我想我会让游戏服务来做这个映射吗?@daniu我也想过。然而,我想知道spring在控制器端是否有处理请求/线程管理的功能。目前的情况是,每个请求都“共享”相同的gameId。你是说请求还是回应?如果每个响应都提供相同的gameId,则可能是您的服务不正确。正如Partrick所说,如果您在响应中看到相同的gameId,则gameservice中的某些内容不正确,您的SQL在后端不正确。对于第二部分,由于Game2是使用gameId作为321为client1创建的,因此,每当您向spring发送任何请求以获取client1时,请始终在请求中发送gameId=321,那么所有处理都将在该客户端和gameId的后端进行-321@AmitK Bist好的,所以我假设服务必须处理这样的操作。我现在的问题是,spring是否具有处理此问题的功能?例如,如果我将一个带有gameId的请求从控制器传递给服务,那么如果有多个游戏发生,spring能否自动映射到正确的线程/游戏?或者这是我必须手动完成的事情。我不确定你如何想象tbh上的工作流程。。。但我想我会让游戏服务来做这个映射吗?@daniu我也想过。然而,我想知道spring在控制器端是否有处理请求/线程管理的功能。目前的情况是,每个请求都“共享”相同的gameId。你是说请求还是回应?如果每个响应都提供相同的gameId,则可能是您的服务不正确。正如Partrick所说,如果您在响应中看到相同的gameId,则gameservice中的某些内容不正确,您的SQL在后端不正确。对于第二部分,由于Game2是使用gameId作为321为client1创建的,因此,每当您向spring发送任何请求以获取client1时,请始终在请求中发送gameId=321,那么所有处理都将在该客户端和gameId的后端进行-321@AmitK Bist好的,所以我假设服务必须处理这样的操作。我现在的问题是,spring是否具有处理此问题的功能?例如,如果我将一个带有gameId的请求从控制器传递给服务,那么如果有多个游戏发生,spring能否自动映射到正确的线程/游戏?或者这是我必须手动完成的事情。
@RequestMapping("/startGame")
@ResponseBody
public String startGameController(@RequestParam(value =
"gameId")
final String gameId) {
return gameService.startGame(gameId);
}