2013-10-09 145 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

固定!結果我後來迭代並更新了一個過時的球員列表。所以被殺的玩家不小心復活了。

道德故事:確保你的域對象總是最新的!