【发布时间】:2019-07-05 15:10:49
【问题描述】:
我有一种处理大量文件的方法。问题是当文件大小增加时,此方法将超时。我正在为该方法使用容器管理的事务。
我所做的是将文件拆分为列表,并提供以另一种方法进行操作,该方法装饰为@REQUIRES_NEW。
我正在循环列表中的新方法和新事务。但是当在迭代中间发生某些事情时,只有事务才会回滚。它不会回滚以前的迭代。我也想回滚以前的迭代。
由于超时问题,我不能将整个操作视为一个操作。正在寻找对此的反馈。
【问题讨论】:
我有一种处理大量文件的方法。问题是当文件大小增加时,此方法将超时。我正在为该方法使用容器管理的事务。
我所做的是将文件拆分为列表,并提供以另一种方法进行操作,该方法装饰为@REQUIRES_NEW。
我正在循环列表中的新方法和新事务。但是当在迭代中间发生某些事情时,只有事务才会回滚。它不会回滚以前的迭代。我也想回滚以前的迭代。
由于超时问题,我不能将整个操作视为一个操作。正在寻找对此的反馈。
【问题讨论】:
您可以考虑以下方法: 当客户端请求文件处理(startProcessing)时,服务器(EJB)启动后台线程(例如quartz-scheduler.org)来处理文件并返回正在进行的操作的id。如果需要,客户端可以使用这样的 id 取消处理、获取处理状态等。
【讨论】:
检查是否增加您的 ejb 方法的事务超时,例如,如果您使用无状态 bean,您可以简单地注释
@StatelessDeployment(transactionTimeout=10)
另一个选项是,检查 EJB 异步方法
https://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html
异步方法通常用于长时间运行的操作、处理器密集型任务、后台任务、增加应用程序吞吐量或改善应用程序响应时间。流程结束后,您可以获取流程的状态。
【讨论】: