5

私は、Glassfish 3.1.2 サーバー上の JAX WebService EJB からの Web サービス クライアントである Java スイング アプリケーションを広く配布しています。

すべてのユーザーがそれを読むまでアクティブなままになる文字列通知を配布できるようにしたいと考えています。通知は、Swing クライアント内にのみ存在する必要があります。

文字列データを入力してデータベースに保存するためのスーパーユーザー Web ポータルを作成しました。

私の質問は:

  1. このデータ文字列通知をクライアントに (プッシュ) 配信するための最適なテクノロジは何ですか?
  2. 通知が表示されたかどうかを知るには、データベースをどのように構築すればよいですか? (クライアントで「新しい通知」の表示を停止できます)

または、素晴らしく機能するガイドへの参照がある場合、私はそれを見つけることができませんでした.

私のアイデア:

  • クライアントに 10 分ごとに Web サービスを呼び出して、新しい通知があるかどうかを確認します。
  • データベースの場合、通知テーブルと表示される通知を作成します。ユーザー テーブルを通知表示テーブルにリンクします。表示される通知は、NotificationID、UserID、TimeSeen の 3 つの列だけの非常に基本的なものです。
4

3 に答える 3

6

プッシュ通知をシミュレートする 1 つの方法は、ロング ポーリングです。この手法は、コメットまたはリバース AJAXと呼ばれます。REST ベースのサービスではより一般的ですが、JAX-WS でも同様に簡単に実現できます。

JAX-WS については、以下を調査する必要があります。

クライアントに 10 分ごとに Web サービスを呼び出して、新しい通知があるかどうかを確認します。

ロング ポーリングの代わりに、最初のクライアント接続をすぐに確立します。ただし、サーバーはすぐに応答するのではなく、(非同期的に) 接続にハングアップします。次に、通知をプッシュする必要がある場合、既存の接続で応答します。

この手法では、情報がサーバーで利用可能になるとすぐに、クライアントに「プッシュ」されます。

データベースの場合、通知テーブルと表示される通知を作成します。ユーザー テーブルを通知表示テーブルにリンクします。表示される通知は、NotificationID、UserID、TimeSeen の 3 つの列だけの非常に基本的なものです。

いいですね。JAX-WS サービスとして公開します。クライアントがメッセージを受信したら、NotificationID を使用して呼び出します。

何かのようなもの:

NotificationService svc = ...;
UserId userId = ...;

AsyncHandler<Notification> handler = new AsyncHandler<Notification>()
{
    public void handleResponse (Response<Notification> response)
    {
       Notification notification = response.get();

       // update swing gui

       NotificationID notificationId = notifcation.getId();

       svc.markNotificationAsSeen(userId, notificationId);

       // continue polling forever (or put in some logic to stop)
       svc.getNotificationAsync(userId, this);
    }
};

Future<?> invocation = svc.getNotificationAsync(userId, handler);
于 2012-12-10T23:47:59.117 に答える
3

多くの場合 10 分で十分であり、ユーザーがそれだけ待つことができることが確実にわかっている場合は、サーバーを 10 分ごとにポーリングすることに固執してください。

(ほぼ) リアルタイムの通知が必要な場合は、JMS (および特にトピックス) を確認してください。HornetQは実装の 1 つであり、JBoss を使用している場合は簡単に使用できます。

于 2012-12-10T22:35:46.987 に答える
2

Message Queue サーバーを使用することをお勧めします。誰かがHornetQまたはActiveMQを提案したように、必要に応じてサーバーに埋め込むことができます。

于 2012-12-10T22:52:59.843 に答える