java - 构建这个并发问题的正确方法是什么? Spring 启动

标签 java spring spring-mvc spring-boot

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

所以在我的 Controller 中,我有这些方法。

@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”。我希望每个请求都会返回一个新的 gameId。当前发生的情况是每个请求都“共享”相同的 gameId。

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

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

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

示例:

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

游戏 1/线程 1:id=123

游戏 2/线程 2:id=321

游戏 3/线程 3:id=213

客户端1发送/startGame?gameId=321

如何将客户端 1 请求指定给游戏 2/线程 2? spring 是否有这方面的功能,或者是否必须在没有 spring 的情况下完成?

感谢您的阅读。

最佳答案

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

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

关于java - 构建这个并发问题的正确方法是什么? Spring 启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47096782/

相关文章:

java - 如何使用 SPRING REST 将 JSON 请求映射到字符串

java - 两个非常长的整数相加

java - 通过 json 对象、Android 和 google map api 从自动完成搜索功能获取位置信息

java - 如何使用 Java 方法返回的 boolean 值?

java - CrudRepository 按一对多关系过滤

java - 速度+ Spring

java - RestTemplate 不传递 Origin header

java - 当作为参数传递给 spring 消息标记时,格式化值会丢失其格式

java - 使用 Spring 定型的优点?

spring - 使用 Grails Spring DSL 进行依赖注入(inject)