2

ですから、私が計画しているアプリケーションのユースケースから始めるのが最善だと思います。

私は、ローカル ネットワーク内の誰もが Web ページを介して音楽をアップロードし、特定の曲に投票できる Audioplayer を作成することを計画しています。最も多くの票を獲得した曲が再生され、視覚化されます。また、Web インターフェイスを介して現在の曲を再生および一時停止できる必要があります。

したがって、私の解決策は 2 つのアプリケーションを作成することです。最初のものはプレイヤーで、曲を再生して視覚化し、データベースから次の曲を取得する必要があります。もう 1 つの部分は、プレーヤーへのファイルのアップロード、ID3 タグの処理、および最終的なデータベースへの挿入を処理するサーブレットです。

ここまでは順調ですね。ここで、再生/一時停止イベントと、視覚化を変更する可能性のあるイベントをすばやく伝達する方法が必要です。私は複数の解決策を考え出しました:

  1. Apache ActiveMQ で Java Message Services を使用して、フロントエンドとビジュアライゼーションの間でイベントを交換します。(MessageListeners で可能なはずなので、応答は高速ですが、追加のテクノロジとして Apache ActiveMQ が必要です)
  2. このようなコマンドを Table に書き込み、プレーヤーに 0.5 秒ごとにスレッドでチェックしてもらいます (欠点: 間隔が短く、サーバー PC / Raspberry Pi に負荷がかかるため、ラグが発生する可能性があります)。
  3. ソケット

これらの解決策のすべてが理想的ではないように思われるため、このコミュニケーションを解決するためのより良い方法はありますか?

4

2 に答える 2

0

最良の方法は、曲プレーヤーがサーブレットからの応答を待機し、サーブレットが応答を受信するとすぐにプレーヤーに曲を再生するように通知する待機および通知メカニズムで実装されたスレッドを使用することだと思います。

このスレッドは、サーブレットとソング プレーヤーの間のブリッジとして機能します。

于 2013-10-10T15:35:28.447 に答える
0

フローを示すために、このサンプル プログラムを作成しました。ここでは、ThreadA をソング プレーヤー、ThreadB を投票アプリケーションとして想定して、次に進みます。通知呼び出しを送信する前に、ビジネス ロジックを記述します。

package com.WaitNotify;

    public class ThreadA {


    public static void main(String[] args) {
        ThreadB b = new ThreadB();
        b.start();

        synchronized (b) {
            try {
                System.out.println("Waiting for b to complete");
                b.wait();
            } catch (InterruptedException e) {
            }
            System.out.println("total is " + b.getTotal());

        }

    }

}

class ThreadB extends Thread {
    private int total = 0;

    public void run() {
        synchronized (this) {
            for (int i = 0; i < 100; i++) {
                this.total += 1;
            }
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("Operationcompleted-- Going to notify");
            notify();
        }
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }
}
于 2013-10-10T16:24:26.243 に答える