【问题标题】:Creating a Listening Service In Java在 Java 中创建监听服务
【发布时间】:2011-09-10 06:45:14
【问题描述】:

我有一个 Web 应用程序,其架构让我不感兴趣。特别是,我有一个 servlet 处理非常大的文件上传(通过 commons-fileupload),然后处理文件,将其传递给服务/存储库层。

向我建议的是,我只需让我的 servlet 上传文件,然后后端的服务进行处理。我喜欢这个主意,但我不知道如何去做。我不知道 JMS。

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

    这听起来很有趣,对我来说很熟悉 :)。我们以类似的方式进行操作。

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

    所有四个项目和文件处理器都使用Amazon S3/Our File Storage 进行文件存储,因此文件存储在所有五个项目之间共享。

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

    我们使用 Spring Frameowrk 和 Tomcat。

    【讨论】:

      【解决方案2】:

      由于这首先是一个学习练习,因此您需要选择一个易于使用的 JMS 提供程序。这个discussion 在一年前推荐了 FFMQ。

      由于您从一个简单的处理器开始,您可以保持简单并使用 JMS 队列。

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

      在处理器方面,如果您使用的是 Java EE,则可以使用 MessageBean。如果您不是,那么我建议使用 3 个 JVM 解决方案——Tomcat、JMS 服务器和消息处理器各一个。本文包含message consuming client 的基础知识。

      【讨论】:

        【解决方案3】:

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

        i) 优于 ii) 的好处是 DB 是集中且快速的资源,而文件系统在本质上通常是缓慢且非集中的。

        所以基本上 servlet 会转储到数据库或文件系统。现在关于谁将处理该转储文件:-a)它可以是上面讨论的监控过程,或者b)您可以使用本质上是异步的JMS这意味着servlet会将触发事件放入队列中,该事件将异步触发新处理线。 如果您对监控过程没问题,请不要在您的系统中不必要地引入 JMS。

        【讨论】:

        • 实际上,我有点偏向于借此机会学习 JMS。在 webapp 场景中线程让我担心(如果我要小心的话,可能是不必要的,但仍然如此)。
        • @jason:如果你愿意的话,当然 JMS 是个好主意。请记住,永远不要将文件内容作为 JMS 有效负载发送到队列,而只发送队列中的文件引用....否则您的队列经常会被弄脏并遇到许多问题...
        【解决方案4】:

        这种情况有很多选择,但最简单的可能是将上传的文件复制到文件系统上的已知位置,并让后台守护程序监控该位置并在找到该位置时进行处理。

        【讨论】:

        • 这是否被认为是“标准”方式(即,如果我在财富 500 强公司找到工作,他们会这样做)吗?如果没有,我还不如学习“正确”的方式。
        • 在我看来(和经验),他们中的许多人都这样做 :-) 如果我的非功能性要求不是太严格(例如,关于可扩展性、安全性、故障转移、事务),我肯定会选择它而不是 JMS,并获得一个易于部署和维护的解决方案。另一方面,如果我的架构需要任何此类 NFR,我可能会开始寻找适合我的 JMS 提供程序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 2011-10-19
        • 2014-10-13
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多