由于我是 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
@Remote
attack()
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.
}