我有一个 Java 1.5 Web 应用程序,可以将任意 PDF 文件转换为图像。即使是一次处理单个 PDF 的所有页面也需要很长时间,因此我想按需处理页面。
我已经read that I can use an ExecutorService
当特定页面的 HTTP 请求到达时,在新线程中启动/排队图像生成操作。如何确保我不会对重复操作进行排队(例如,两个用户从同一个 PDF 请求同一页面)而不诉诸单线程执行器?我如何使用同步列表之类的东西来跟踪工作线程正在处理哪些图像(或者什么类型的同步机制可以帮助我跟踪它)?
最佳答案
您可以使用ConcurrentHashMap<String, Future<String>>
以 PDF 标识符(例如文件路径等)作为键,以代表转换操作本身的任务作为值。
putIfAbsent
方法ConcurrentHashMap
可以处理比较并设置操作和isDone
的问题方法Future
可以指示转换是否完成。
何时 putIfAbsent
返回null
,这意味着给定 PDF 的转换任务尚不存在,因此您需要调用 ExecutorService.submit(Callable<T> task)
启动您新创建的转换任务;否则,您将忽略此步骤并等待现有任务完成。
样机:
Future<String> conversionTask = ... // blah
Future<String> existingTask = conversions.putIfAbsent(pdfId, conversionTask);
if (existingTask != null) {
conversionTask = existingTask;
}
// Either way, conversion is scheduled by now.
ExecutorService
负责对您的转化请求进行排队。
转换完成后,您可以通过 Future<V>.get()
检索结果方法。
请注意,规范不允许在 Java EE 应用程序中生成线程。常见的方法是将异步处理分离为 JMS 服务 - Apache Camel可以在这里为您提供帮助。
关于java - 跟踪 Java Web 应用程序中的并发文件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15994690/