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

时间:2010-11-30 08:58:49

标签: java java-ee jms scalability

我遇到类似于here上的线索的工作情况。不同之处在于我们没有使用Web服务。但我们正在使用网络应用程序。我们要求允许用户下载8000条记录,其中至少有30列通过jxl写入excel文件。

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

我们目前正在做的是通过jms从应用程序服务器委托此要求。应用服务器将请求发送给代理,然后消费者从队列中获取请求,处理它并发回excel文件的URL。

我对此有一些疑虑,因为我读过有关JMS的内容,并且大多数建议的用例都涉及异步请求,因此用户不必等待很长时间,例如发送电子邮件,发送批准请求,开发票。这个thread中有很多例子,建议的用例可以异步完成。所以我们当前的解决方案听起来像是黑客而不是真正的解决方案。

可以采取哪些建议,模式来进一步改善这一过程?

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

2 个答案:

答案 0 :(得分:4)

我明白了吗?

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

如果是这样,我同意,这是对JMS的异步性质的可怕滥用。

我要做的是:

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

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

答案 1 :(得分:1)

我不会建议你可以用你的JMS后端做什么 - 它可能用得不好或者可能是 - 我不确定。

我们实现了类似的东西,这就是我们最终的结果(我们的后端implmentation完全不同,对于不同的用例,但“async user exp”匹配):

  1. 允许用户提交请求。
  2. 收到一次(1)后,将作业提交给后端(JMS等......)并将其绑定到作业ID
  3. (1)的响应是这个(永久或临时)句柄 - 作业ID,例如
  4. 后端实现应该通过设置作业状态来结束
  5. 允许用户轮询作业状态(通过您提供的句柄)
  6. 如果作业状态为“正在进行中”,请告诉他们(可能是预计完成的时间 - 这样他们就不会浪费时间轮询并给你带来负担)。
  7. 如果状态为“已成功完成”,请向用户报告该用户需要访问结果的其他数据(网址等)