【问题标题】:EJB3 client callback?EJB3 客户端回调?
【发布时间】:2013-02-07 23:52:41
【问题描述】:

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

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

我有一个名为PlayBean@Stateless 会话bean,其方法名为attack()defend(),由@WebService@Remote 接口公开。如果attack()被玩家A调用,我需要通知被攻击的玩家B,以便B可以决定用什么参数调用defend()。具体而言,这相当于 A 调用 PlayBean 的托管 bean,然后 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.
}

【问题讨论】:

    标签: java callback ejb ejb-3.0


    【解决方案1】:

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

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

    如果客户端是一个瘦 Web 应用程序,那么您真正关注的是 Web 框架提供的内容(以及更少的 EJB……尽管 JMS 仍然可以在服务器中用于触发事件)。 ICEfaces 和 Primefaces 等 JSF 框架支持服务器推送,这允许服务器将更新推送到客户端。我想ZK也支持这个,所以不限于JSF。

    不管怎样,我认为这个问题的答案不仅仅由 EJB 描述。希望这会有所帮助。

    【讨论】:

    • 感谢 EdH - 这帮助我重新思考了我的问题;我在上面编辑过。我缺少的关键部分是如何从会话 bean“备份”到 JSF 托管 bean……而不是实际调用会话 bean 的托管 bean,而是用于不同用户的托管 bean。我希望我编辑的问题现在更完整。
    【解决方案2】:

    也许您应该重新考虑您对成熟 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 美分..

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多