繁体   English   中英

Java中的多线程Web应用程序

[英]multithreaded web application in java

我正在做一个Web应用程序,它以Java为前端,而shell脚本为后端。 这个概念是我需要在后端处理多个文件。 我将从用户那里获取日期范围(例如从7月1日至8日),并且每天处理约100个文件。 因此,我总共要处理800个文件。

我将从JSP获得这些详细信息,并将后台调用委派给Shell脚本,并返回结果并将其显示给用户。

现在,我以顺序方式进行了所有这些操作-我的意思是没有线程。 因此,只有一个主线程在执行,用户必须等到依次处理800个文件。 但是,这确实很慢。 因此,我正在考虑使用线程。 由于我是线程初学者,因此我阅读了一些有关此方面的知识,并提出了以下想法:

在阅读线程时,必须将工作拆分。.我想到将8天的工作拆分为4个线程,每个线程将执行2天的工作


我想知道我是否遵循正确的方法,我主要担心的是:

  1. 是否建议从Web应用程序生成多个线程
  2. 这是否是一个好方法

有关如何进行此操作的一些指导。 一个例子很好。 谢谢。

是的,您可以在多线程或任何高性能环境中运行长时间的处理作业。 您还应该使用Servlet 3.0异步请求处理来挂起请求线程,并等待直到Long处理任务完成。

  1. 是的,从Web应用程序中产生多个线程没有任何问题。 实际上,如果您正在运行Servlet容器(很可能是因为使用Java而已),那么它已经为您生成了多个线程。 通常,Servlet容器会自动产生一个新线程(或从池中重用一个新线程)来处理它收到的每个请求。

  2. 您的方法很好,因为考虑到系统的硬件配置和Web服务上的并发负载量,您可能希望将线程数微调到合适的值。 还要注意,虽然分解一堆线程将减少处理所有数据所需的总时间,但在准备好将数据返回给用户之前,仍会留下很大的时间。 因此,依次执行较小的工作单元,并在准备好每一批结果后将其发布到用户界面,您可能会获得更好的结果。 然后,用户仍然需要很长时间才能拥有所有数据,但这几乎可以立即开始查看其中的至少一部分。

在Web应用程序中创建线程不是一个好的解决方案。 这是一个糟糕的设计,因为通常是负责该活动的容器(Web服务器)。 因此,我认为您必须找到其他解决方案。

我建议您将shell脚本放在计划运行每分钟的cron中,并“激活”它们,您可以触摸充当信号灯的文件。 每次运行时,脚本都会验证Web应用程序是否触摸了信号量文件,如果是,则它们从这些文件中读取日期间隔,然后开始处理。

改善用户体验的方法不是通过在100,000个线程上的Servlet级别并行化,而是提供视图的增量呈现。 首先,例如根据MVC模式,将应用程序分成多个层将很有用。

这样说,您将不得不考虑如何

  • 创建一个能够返回部分答案和最后答案的服务,这意味着已返回所有可用数据。 每个答案都可以并行计算以提高性能。

  • 通常,通过回调此服务来逐步填充网页,该服务返回用于将数据添加到DOM的JSON字符串。 每次获得答案时,如果这是部分答案,则再次呼叫提供先前序列号的服务。

如果您希望Liligo有所了解,您将看到它是如何工作的。 我描述的技术称为轮询,但是还有其他技术可以在UI级别获得类似的异步结果。 通常,您不希望直接使用Servlet API(这是一个非常低级的API),而是为此使用合理的框架或抽象。

如果您想提出建议,则应该看看Play! 框架http://www.playframework.org/documentation/2.0.2/JavaStream HTTP流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM