繁体   English   中英

哪些Java /设计模式可用于长时间运行的同步过程?

[英]What Java/Design Patterns can be used for Long Running Synchronous Processes?

我在工作中遇到的情况类似于这里的话题 不同之处在于我们没有使用Web服务。 而是我们正在使用一个Web应用程序。 我们有一项要求,要求用户下载至少30列的8000条记录,并通过jxl写入excel文件。

这是一个长期运行的过程,由于我不知道的原因,它不是异步完成的。 它还具有巨大的内存空间〜500-800 MB。 最重要的是,平均需要2分10秒才能完成。

我们当前正在做的事情是通过jms从应用程序服务器中委派该需求。 应用服务器将请求发送到代理,然后使用者从队列中获取请求,进行处理,然后发回excel文件的url。

我对此有些疑虑,因为我已经读过有关JMS的文章,并且建议的大多数用例都涉及异步请求,这样用户就不必再等很长时间了,例如发送电子邮件,发送批准请求,开具发票。 线程中有很多示例,建议的用例可以异步完成。 因此,我们当前的解决方案听起来像是骇客,而不是真正的解决方案。

有什么建议,模式可以用来进一步改善这一过程吗?

编辑:不幸的是,如果您可以将其称为功能的“同步性”,那是我的业务需求,因此我无法取消它。 因此,我在寻找可以提高性能并减少进程的堆内存使用量的答案/调整/技巧/模式。

我明白这个意思吗?

  • 用户发出请求。 在此请求期间
    • 发送了一条JMS消息
    • 创建的Excel文件
    • 返回的JMS消息
    • 然后将URL发送给用户?

如果是这样,我同意,那就是对JMS异步特性的严重滥用。

我要做的是:

立即向用户显示结果页面,其中包含正在处理您的请求的文本,然后

  • 要么使用AJAX轮询服务器以获取结果URL(可能向用户显示一个状态栏)
  • 或通过电子邮件将URL发送给客户

我不会建议您使用JMS后端可以做什么-它可能使用不当或也许是-我不确定。

我们实现了类似的操作,最终得到的结果(对于不同的用例,我们的后端实现是完全不同的,但是“异步用户exp”匹配):

  1. 允许用户提交请求。
  2. 收到(1)后,将作业提交到后端(JMS等...)并将其绑定到作业ID
  3. (1)的响应是此(永久或临时)句柄-作业ID,例如
  4. 后端实现应通过设置作业状态来结束
  5. 允许用户轮询工作状态(通过您提供给他们的手柄)
  6. 如果工作状态为“进行中”,请告诉他们(可能需要估计的完成时间,这样他们才不会不必要地浪费时间来轮询和加重您的负担)
  7. 如果状态为“成功完成”,则向用户报告该结果以及用户需要访问结果的其他数据(URL等)。

暂无
暂无

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

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