【问题标题】:Better way to communicate between Java Servlet and a normal Java Application在 Java Servlet 和普通 Java 应用程序之间进行通信的更好方法
【发布时间】:2013-10-10 15:31:55
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java servlets ipc


    【解决方案1】:

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

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

    【讨论】:

    • 这将如何工作?线程不是只能从启动它们的程序访问吗?
    【解决方案2】:

    我创建了这个示例程序来演示流程。在这里,您可以假设 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;
        }
    }
    

    【讨论】:

    • 首先,感谢您的努力。问题是,Java Servlet 在请求时由 Tomcat 运行。它将驻留在不同的包中。据我了解线程,这种线程间通信仅在它们位于同一程序中时才有效。我想如果像我这样有两个单独的程序,那是行不通的。
    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2015-07-15
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 2023-03-15
    • 2012-01-28
    • 2013-05-15
    相关资源
    最近更新 更多