【发布时间】: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.
}
【问题讨论】: