在Java Servlet和普通Java应用程序之间进行通信的更好方式



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

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

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

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

  1. 将 Java Message Services 与 Apache ActiveMQ 配合使用前端和可视化之间的事件。(应该是可能与消息侦听器,所以响应会很快,但是需要Apache ActiveMQ作为附加技术(
  2. 将此类命令写入表中,并让玩家使用每半秒左右的线程(缺点:可能看起来滞后,因为间隔低,也会在服务器 PC/覆盆子上产生负载圆周率(
  3. 插座

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

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

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

我创建了此示例程序来演示流程。在这里,您可以假设线程A作为歌曲播放器,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;
    }
}

最新更新