2

私は EJB3 を初めて使用するため、学習目的で、サーバー側に EJB3 を使用するクライアント/サーバー アプリとしてボード ゲームのリスクを実装しています。その意図は、複数のユーザーがログインして一緒にゲームをプレイすることです。当面はフロントエンドにJSFを使おうと考えています。

あるクライアント「A」によるアクションの結果、他のクライアント「B」に通知する必要がある場合が複数あります。たとえば、A が B が所有する国を攻撃した場合、B はそれについて知る必要があります。たとえば、ロールするサイコロの数や、カードをプレイしたいかどうかを検討します。

またはインターフェースによって公開された、および と呼ばれるメソッドで呼び出される@Statelessセッション Beanがあります。がプレイヤー A によって呼び出された場合、攻撃されたプレイヤー B に通知して、B が呼び出すパラメーターを決定できるようにする必要があります。具体的には、A のマネージド Bean が PlayBean を呼び出し、次に PlayBean が B のマネージド Bean にコールバックすることになります。このセッション Bean からマネージド Bean へのコールバックを実行するにはどうすればよいですか? (マネージド Bean に「到達」できたら、そこから JSF のサーバープッシュ機能を調べて、ユーザーに直接アクセスできます)PlayBeanattack()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 など) を使用する場合、問題は常に同じです。Web ページの実際のプッシュのようなものはありません。2 つの選択肢があります。

  1. ポーリング (メタリフレッシュなど) またはユーザーによる手動リフレッシュ

  2. コメット 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 フレームワークは、server-push をサポートしています。これにより、サーバーは更新をクライアントにプッシュできます。ZKもこれに対応していると思いますので、JSFに限ったことではありません。

いずれにせよ、これに対する答えは EJB だけで説明できるものではないと思います。お役に立てれば。

于 2013-02-08T00:30:13.183 に答える