2

由于我是 EJB3 新手,因此出于学习目的,我将棋盘游戏 Risk 实现为一个客户端-服务器应用程序,在服务器端使用 EJB3。目的是让多个用户登录并一起玩游戏。目前,我正在考虑将 JSF 用于前端。

在多个实例中,某个客户端“A”的操作需要导致某个其他客户端“B”被通知。例如,如果 A 攻击 B 拥有的国家,B 需要知道这件事,例如考虑要掷多少个骰子以及他们是否想打牌。

我有一个@Stateless会话 bean ,它使用名为andPlayBean的方法调用,由 a或接口公开。如果被玩家 A 调用,我需要通知被攻击的玩家 B,以便 B 可以决定调用什么参数。具体来说,这相当于 A 调用 PlayBean 的托管 bean,然后 PlayBean 调用 B 的托管 bean。如何执行此会话 bean 到托管 bean 回调?(一旦我可以“访问”托管 bean,我就可以从那里查看 JSF 的服务器推送功能以直接发送给用户)attack()defend()@WebService@Remoteattack()defend()

我的直觉是让页面 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.
}
4

2 回答 2

0

也许您应该重新考虑您对成熟 EAR 的看法以及不同组件的角色。如果您正在使用 EJB,您应该将应用程序视为一个事务系统。如果你愿意的话,很多问题都可以转化为交易问题。

在您的情况下,您应该将 JSF 托管 bean 视为控制器扩展或页面的支持 bean。除了向 EJB 显示信息或隧道操作外,其中没有任何逻辑或状态。这表示不需要从 EJB 回调它们。

那么你的数据模型在哪里呢?(即谁攻击谁。)对于这个例子来说,拥有这个数据的 Singleton EJB 可能就足够了。然后您可以使用您的 PlayBean 来修改 Singleton Data Model Bean 的数据。

现在是时候为您的最后一个问题找到解决方案了。如何通知玩家数据的变化。(这就是“你被攻击了”的事情)。如果您使用任何 html 前端(如 JSF),问题总是相同的。没有像真正推动网页这样的事情。我看到两个选择:

  1. 轮询(如元刷新)或用户手动刷新

  2. 使用像 Comet 2 这样的东西。

因此,您的问题不是关于 EJB 或 JAF 托管 bean,而是关于 HTML 前端推送通知;-)

只是我的2美分..

于 2013-02-11T10:12:28.980 回答
0

我认为这在很大程度上取决于您未提供的信息。

例如,如果客户端是胖客户端(Java 或其他),您可以在服务器中使用 JMS 设置消息传递方法。客户端在连接时只需设置一个侦听事件的消息传递客户端。服务器可以使用消息启动事件。如果客户端使用Java,客户端也可以使用JMS。但是如果需要,使用 Messaging 会使客户端和服务器组件使用不同的语言构建。

如果客户端是一个瘦 Web 应用程序,那么您实际上是在查看 Web 框架提供的内容(以及更少的 EJB ......尽管 JMS 仍然可以在服务器中用于触发事件)。ICEfaces 和 Primefaces 等 JSF 框架支持服务器推送,这允许服务器将更新推送到客户端。我认为 ZK 也支持这一点,因此它不仅限于 JSF。

无论哪种方式,我认为这个问题的答案不仅仅由 EJB 描述。希望这可以帮助。

于 2013-02-08T00:30:13.183 回答