0

我正在使用 Spring 和 MongoDB 为游戏制作 Web 服务。其中一项功能是,每天,玩家都可以投票给其他玩家杀死。在一天结束时,投票被统计,得票最多的玩家被杀死。这是杀死投票最多的玩家的代码(在一个更大的方法中endDay()):

//mostVotes is the player's id in the database.
//Player is just a transient domain object
//playerDAO is a custom DAO that interfaces with MongoDB (see below)
Player accused = playerDAO.getPlayerByID(mostVotes);
logger.info(accused.getIsDead()); //This is false
doKill(accused);
logger.info(playerDAO.getPlayerByID(mostVotes).getIsDead()); //This is true

这是 getPlayerByID():

//mongoTemplate is a MongoOperations object
public Player getPlayerByID(String id) throws NoPlayerFoundException {
    Player p = mongoTemplate.findById(id, Player.class);
    if (p == null) {
        throw new NoPlayerFoundException(id);
    }
    return p;
}

和doKill():

private void doKill(Player p) {
    p.setIsDead(true);
    playerDAO.updatePlayer(p);
}

和更新播放器():

public void updatePlayer(Player p) {
    mongoTemplate.save(p);  
}

如您所见,当我在杀死玩家后(在图中endDay())询问玩家的状态时,他似乎已经死了,这正是我们想要的。

现在我向 发出请求/player/idid玩家的 id 在哪里。这让我返回了结果 Player 对象的 JSON 编码(使用与getPlayerByID()上面相同的方法)。如果我用死去的玩家的 id 提出这个请求,他就会活着回来。

更复杂的是,其他更新可以跨请求进行。例如,某些玩家可以在没有投票的情况下杀死其他玩家。这种杀戮使用完全相同的Player, getPlayerByID(),doKill()updatePlayer(),并且受害者的死亡持续存在。

我目前正在本地主机上的 Tomcat v7.0 服务器上运行它。

4

1 回答 1

0

固定的!结果我后来迭代并更新了一个过时的玩家列表。所以被杀的玩家意外复活了。

故事的寓意:确保您的域对象始终是最新的!!!

于 2013-10-09T20:14:47.773 回答