我遇到的情况是,有时(并非总是)我的异步作业无法在所需的时间之前处理结果,我必须向客户端返回某种消息,说通过检查数据库中的请求仍在准备他的请求。

请求和为其创建所需的对象在一个数据库Transaction中处理,异步过程在另一个Transaction中处理。我通过将可运行实例传递给execute方法来使用ScheduledThreadPoolExecutor

有时客户端发出请求,而当他的浏览器正在加载我的异步作业时,这些问题能够为它准备必要的数据,但有时并非如此。

所以我的问题是:无论如何,我是否可以告诉异步作业等待数据准备就绪?

最佳答案

恐怕仅使用Runnable实例,您将无法告诉进程等待,除非您将Thread休眠一段时间或循环并不断询问结果都是不好的主意。

为了使此操作正确发生,您应该通过将FutureTask实例传递给它的构造函数来使用Callable。通过覆盖call()方法,您应该告诉事务处理程序完成这项工作。

您还需要具有某种任务管理器,该任务管理器会将任务添加到队列中并创建一个线程池,该线程池将接收并处理这些任务。出于队列目的,我建议使用例如:LinkedBlockingDeque,它接受FutureTask的通用类型。

另外,您还应该通过名称或以FutureTask为值的名称映射未来任务的映射。在等待处理给定FutureTask线程时的结果方面,您必须立即将其从期货地图中删除。然后,当您的客户请求时,您应该检查:如果期货地图包含该任务,请从中获取FutureTask并在其上调用futureTask.get()。这将等待任务完成。

这只是我会采用的方法。希望这可以帮助。

10-07 23:53