gpt4 book ai didi

java - 跟踪 Java Web 应用程序中的并发文件处理

转载 作者:行者123 更新时间:2023-12-02 07:06:49 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com