在Java中创建侦听服务

在Java中创建侦听服务,java,Java,我有一个webapp,它的体系结构让我不感兴趣。特别是,我有一个servlet处理一个非常大的文件上传(通过commons fileupload),然后处理该文件,并将其传递到服务/存储库层 我得到的建议是,我只需要让servlet上传文件,然后由后端的服务进行处理。我喜欢这个主意,但我不知道该怎么办。我不知道 其他详情: -应用程序是一个GWT应用程序,使用MVP架构拆分为推荐的客户端/服务器/共享子包。 -目前,我只在GWT托管模式下运行,但我计划在不久的将来迁移到Tomcat 我非常愿意学

我有一个webapp,它的体系结构让我不感兴趣。特别是,我有一个servlet处理一个非常大的文件上传(通过commons fileupload),然后处理该文件,并将其传递到服务/存储库层

我得到的建议是,我只需要让servlet上传文件,然后由后端的服务进行处理。我喜欢这个主意,但我不知道该怎么办。我不知道

其他详情: -应用程序是一个GWT应用程序,使用MVP架构拆分为推荐的客户端/服务器/共享子包。 -目前,我只在GWT托管模式下运行,但我计划在不久的将来迁移到Tomcat


我非常愿意学习任何我需要的东西来让它工作(事实上,这就是编写应用程序的目的)。我不希望有人为我编写代码,但有人能为我指出正确的开始方向吗?

这个场景有很多选择,但最简单的方法可能是将上传的文件复制到文件系统上的已知位置,并在找到它时让后台守护进程监视该位置和进程。

@Jason,有很多方法可以解决你的问题。 i) 已将文件数据转储到列类型为BLOB的数据库中。并有一个DB轮询线程(在特定时间段后)轮询新插入文件的表。 ii)将文件转储到文件系统中,并执行文件监控流程

i)优于ii)的好处是,DB是集中的、快速的资源,而as文件系统本质上是缓慢的、非集中化的

所以基本上servlet将转储到DB或文件系统。现在,关于谁将处理该转储文件:-a)它可以是上面讨论的监视过程,或者b)您可以使用本质上是异步的JMS,这意味着servlet将在队列中放置一个触发器事件,该事件将异步触发新的处理线程。
如果您对监视过程没有意见,那么就不要在系统中不必要地引入JMS。

因为这是一个最重要的学习练习,所以您需要选择一个易于使用的JMS提供程序。这是一年前提出的FFMQ

因为您是从一个简单的处理器开始的,所以可以保持它的简单并使用JMS队列

在最简单的形式中,servlet发送的每条消息必须对应于单个作业。您可以将上传的整个负载放在消息中,也可以只发送一个文件名作为消息中内容的引用。这些是以后可以重构的细节


在处理器方面,如果您使用的是JavaEE,那么可以使用MessageBean。如果您不是,那么我建议使用3个JVM解决方案——Tomcat、JMS服务器和消息处理器各一个。这篇文章包括a的基础知识。

这听起来很有趣,我也很熟悉:)。我们也是这样做的

我们有四个项目,所有四个项目都包括文件上传和文件处理(图像/视频/PDF/文档)等。因此,我们创建了一个项目来处理所有文件处理,如下所示:

所有四个项目和文件处理器都使用
amazons3
/
我们的文件存储
进行文件存储,因此文件存储在所有五个项目中共享

我们通过http请求向文件处理器发出请求,以XML格式提供详细信息,其中包括S3/Stoarge上的文件路径、aws身份验证详细信息、文件转换/处理参数。文件处理器进行处理并将处理后的文件放入
S3/Storage
,使用处理后的文件详细信息构造XML,并通过响应发送XML


我们使用Spring Framework和Tomcat。

这被认为是“标准”方式吗(即,如果我在财富500强公司找到一份工作,他们会这样做吗)?如果不是的话,我还不如学习“正确”的方法。在我看来(和经验),他们中的许多人都是这样做的:-)如果我的非功能性需求不是太严格(比如,关于可伸缩性、安全性、故障切换、事务),我肯定会选择这一方法而不是JMS,并获得一个易于部署和维护的解决方案。另一方面,如果我的架构需要任何这样的NFR,我可能会开始寻找一个适合我的JMS提供者。实际上,我有点喜欢利用这个机会学习JMS。在webapp场景中,线程让我担心(如果我要小心的话,可能是不必要的,但仍然如此)。@jason:如果你愿意,JMS当然是个好主意。请记住,永远不要将文件内容作为JMS有效负载发送到队列,而只发送队列中的文件引用……否则,您的队列会经常出错并遇到许多问题。。。