我有一种情况,有时(并非总是)我的异步作业无法在需要的时间内处理结果,我必须向客户返回某种消息,说他的请求仍在通过在数据库中检查来准备.
请求和为其创建必要的对象在一个数据库事务中处理,异步过程在不同的事务中处理。我ScheduledThreadPoolExecutor
通过将可运行实例传递给执行方法来使用。
有时客户端发出请求并且他的浏览器正在加载我的异步作业时的问题能够为其准备必要的数据,但有时它不是。
所以我的问题是:无论如何我可以告诉异步作业等到数据准备好了吗?
我有一种情况,有时(并非总是)我的异步作业无法在需要的时间内处理结果,我必须向客户返回某种消息,说他的请求仍在通过在数据库中检查来准备.
请求和为其创建必要的对象在一个数据库事务中处理,异步过程在不同的事务中处理。我ScheduledThreadPoolExecutor
通过将可运行实例传递给执行方法来使用。
有时客户端发出请求并且他的浏览器正在加载我的异步作业时的问题能够为其准备必要的数据,但有时它不是。
所以我的问题是:无论如何我可以告诉异步作业等到数据准备好了吗?
恐怕只使用一个 Runnable 实例,您无法告诉进程等待,除非您将线程休眠一段时间或循环并继续询问结果,这两个都是坏主意。
为了使这正确发生,您应该通过将Callable实例传递给它的构造函数来为此使用FutureTask 。通过覆盖您的 call() 方法,您应该告诉您事务处理程序来完成这项工作。
您还需要有某种任务管理器,它将任务添加到队列中并创建一个线程池来接收和处理这些任务。出于队列目的,我建议使用例如:LinkedBlockingDeque,它接受 FutureTask 的通用类型。
此外,您应该有一张未来任务的地图,由他们的名字或以 FutureTask 作为值的东西映射。在处理给定的FutureTask时等待结果,您必须立即将其从期货地图中删除。然后,当您的客户请求时,您应该检查:如果期货地图包含任务,则从中获取 FutureTask 并在其上调用 futureTask.get()。这将等到任务完成。
这只是我会采用的方法。希望这可以帮助。