在 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
Struts2 与普通的java内通信 也就是所谓的 Action类 来获取servlet中request对象和response对象
Struts2 与普通的java内通信 也就是所谓的 Action类 来获取servlet中request对象和response对象