2013-10-09 104 views
0

我正在为使用Spring和MongoDB的游戏制作Web服务。其中一个特点是,玩家每天都可以对其他玩家投票杀死。在一天结束时,选票将被记录下来,而得票最多的选手将被杀死。下面是杀死-投票,大多数球员的代码(较大的方法中调用endDay()):Spring MongoDB不一致持久性问题

//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); 
} 

而且updatePlayer():

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

正如你所看到的,当我在杀死他后立即要求球员的状态时(在endDay()),他似乎已经死了,这正是我们想要的。

现在我向/player/id发出请求,其中id是玩家的ID。这给了我一个对生成的Player对象的JSON编码(使用与上面相同的getPlayerByID())。如果我以死亡玩家的身份提出这个请求,他会恢复活力。

更复杂的是,其他更新通过请求很好地通过。例如,某些玩家可以不投票就杀死其他玩家。这次杀戮使用完全相同的Player,getPlayerByID(),doKill()updatePlayer(),并且受害者的死亡持续存在。

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

+0

如果您喜欢,您还可以直接看源代码:[link](https://github.com/err1100/Werewolf)。 – err1100

回答

0

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

道德故事:确保你的域对象总是最新的!