私は EJB3 を初めて使用するため、学習目的で、サーバー側に EJB3 を使用するクライアント/サーバー アプリとしてボード ゲームのリスクを実装しています。その意図は、複数のユーザーがログインして一緒にゲームをプレイすることです。当面はフロントエンドにJSFを使おうと考えています。
あるクライアント「A」によるアクションの結果、他のクライアント「B」に通知する必要がある場合が複数あります。たとえば、A が B が所有する国を攻撃した場合、B はそれについて知る必要があります。たとえば、ロールするサイコロの数や、カードをプレイしたいかどうかを検討します。
またはインターフェースによって公開された、および と呼ばれるメソッドで呼び出される@Stateless
セッション Beanがあります。がプレイヤー A によって呼び出された場合、攻撃されたプレイヤー B に通知して、B が呼び出すパラメーターを決定できるようにする必要があります。具体的には、A のマネージド Bean が PlayBean を呼び出し、次に PlayBean が B のマネージド Bean にコールバックすることになります。このセッション Bean からマネージド Bean へのコールバックを実行するにはどうすればよいですか? (マネージド Bean に「到達」できたら、そこから JSF のサーバープッシュ機能を調べて、ユーザーに直接アクセスできます)PlayBean
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.
}