2013-02-07 84 views
2

爲了學習,我是EJB3的新手,我將服務器端的EJB3作爲客戶端 - 服務器應用程序來實現棋盤遊戲Risk。其目的是多個用戶共同登錄並玩遊戲。目前,我正在考慮使用JSF作爲前端。EJB3客戶端回調?

有多個實例,其中由某些客戶端「A」的動作需要導致一些其它客戶端「B」被通知。例如。如果A攻擊B所擁有的國家,則B需要知道它,例如,考慮擲出多少骰子以及他們是否想玩牌。

我有一個@Stateless會話bean caled PlayBean一個名爲attack()defend()方法,暴露或者由@WebService@Remote接口。如果玩家A調用attack(),我需要通知受到攻擊的玩家B,以便B可以決定用什麼參數調用defend()。具體而言,這相當於A的託管bean調用PlayBean,然後PlayBean調用回B的託管bean。我如何執行這個會話bean到託管bean回調? (一旦我可以'進入'管理bean,從那裏我可以看到JSF的服務器推送功能直接向用戶提供)

我的直覺是讓頁面bean提供一個回調對象作爲參數到會話bean ......但這是否以EJB3的方式工作?

@Stateless 
public class PlayBean implements Play { 
    @Override 
    public void attack(OccupiedTerritory from, OccupiedTerritory to, int battalions, Set<Leader> leader) { 
    int attackDice = battalions; 
    Die die = new Die(6); // TODO read number of sides from cfg 
    Iterator<Leader> leaderIt = leader.iterator(); 
    int[] roll = new int[attackDice]; 
    for (int i = 0; i < attackDice; i++) { 
     int bonus = leaderIt.hasNext() ? leaderIt.next().getAttackBonus() : 0; 
     roll[i] = die.roll(bonus); 
    } 
    Arrays.sort(roll); 
    Player victim = to.getOccupier(); // ...but how do I nudge this player (NOT the player that invoked this method) to act, i.e. to choose how many defence dice to use? I need to get a reference to "victim"'s JSF managed bean. 
} 

回答

0

我認爲很多這取決於你沒有提供的信息。

例如,如果客戶端是一個胖客戶端(Java或其他方式),您可以設置在服務器中使用JMS消息傳遞的方式。客戶端在連接時只需設置一個偵聽事件的消息客戶端。服務器可以使用消息發起事件。如果在客戶端中使用Java,則JMS也可以在客戶端中使用。但是如果需要,使用消息傳遞將使客戶端和服務器組件使用不同的語言構建。

如果客戶是薄,Web應用程序,那麼你真的在看什麼Web框架提供(少EJB ......雖然JMS仍然可以在服務器被用來觸發事件)。像ICEfaces和Primefaces這樣的JSF框架支持服務器推送,它允許服務器將更新推送到客戶端。我認爲ZK也支持這一點,所以它不僅限於JSF。

無論哪種方式,我認爲這個問題的答案並不僅僅由EJB的描述。希望這可以幫助。

+0

謝謝EdH--這幫助我重新思考了一下我的問題;我已經在上面編輯過了。我缺少的關鍵是如何從一個會話bean'備份'到一個JSF託管bean ......而不是實際調用會話bean的同一託管bean,而是一個用於不同用戶的託管bean。我希望我編輯的問題現在更完整。 – womblbombl

0

可能是你應該重新考慮你一個完全成熟的EAR的觀點和不同組分的作用。如果您在使用EJB,您應該將應用程序視爲交易系統。如果你願意的話,很多問題都可以轉化爲交易問題。

在你的情況,你應該看看JSF管理bean作爲一個控制器擴展,或者頁面的支持bean。除了向EJB顯示信息或隧道操作之外,沒有任何邏輯或狀態。這表示應該不需要從EJB調用它們。

那麼你的數據模型在哪裏? (即Who攻擊誰)。在這個例子中,擁有一個Singleton EJB持有這些數據可能就足夠了。您可以使用您的PlayBean來修改Singleton Data Model Bean的數據。

現在是時候爲您的最終問題找到解決方案。如何通知玩家數據的變化。 (這就是「你遭到襲擊」的事情)。如果您使用任何html前端(如JSF),問題始終是相同的。沒有像網頁真正推動的東西。我看到兩個選擇:

  1. 輪詢(像元刷新)或手動刷新用戶

  2. 使用類似彗星2.

所以你的問題不是的EJB或JAF託管豆,它是關於HTML前端推送通知;-)

只是我的2美分..