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

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案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 运行。它将驻留在不同的包中。据我了解线程,这种线程间通信仅在它们位于同一程序中时才有效。我想如果像我这样有两个单独的程序,那是行不通的。

以上是关于在 Java Servlet 和普通 Java 应用程序之间进行通信的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

Java-Servlet--《12-WEB应用中的普通Java程序如何读取资源文件.mp4》 有疑问

在java中如何在非servlet的普通类中获取requestresponsesession

java web002——jsp(本质也是servlet)

Java EE JSP编程基础

Struts2 与普通的java内通信 也就是所谓的 Action类 来获取servlet中request对象和response对象

Struts2 与普通的java内通信 也就是所谓的 Action类 来获取servlet中request对象和response对象