2

所以,我想最好从我正在计划的应用程序的用例开始。

我计划创建一个音频播放器,本地网络中的每个人都可以通过网页上传音乐并为特定歌曲投票。然后将播放和可视化得票最多的歌曲。还应该可以通过网络界面播放和暂停当前歌曲。

所以我的解决方案是编写两个应用程序;第一个是播放器,它应该播放歌曲并将它们可视化,并从数据库中获取下一首歌曲。另一部分是一个 servlet,它处理文件上传到播放器和 ID3 标签的处理以及最终插入数据库。

到目前为止,一切都很好。现在我需要一种方法来快速传达播放/暂停事件以及可能的事件以更改可视化。我想出了多种解决方案:

  1. 使用带有 Apache ActiveMQ 的 Java 消息服务在前端和可视化之间交换事件。(应该可以使用 MessageListeners,因此响应会很快,但需要 Apache ActiveMQ 作为附加技术)
  2. 将此类命令写入表格并让玩家每半秒左右使用一个线程检查一次(缺点:可能看起来很滞后,因为间隔很短,并且还会在服务器 PC / Raspberry Pi 上产生负载)
  3. 插座

有没有更好的方法来解决这种通信,因为所有这些解决方案似乎都不理想?

4

2 回答 2

0

我想最好的方法是使用带有等待和通知机制的线程,歌曲播放器将等待来自 servlet 的响应,一旦 servlet 收到响应,它就会通知播放器播放歌曲。

该线程将充当 servlet 和歌曲播放器之间的桥梁。

于 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 回答