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

标签 java multithreading web-applications concurrency executorservice

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

相关文章:

java - 什么是最好的 java html 解析器?

python - 如何在 Flask 中初始化 session ?

Angular 和 IIS WebApplication(或虚拟目录)

ruby-on-rails - 如何在不更改代码的情况下将单站点应用程序变成可维护的多站点应用程序?

java - Java 中元音变音的问题

java - Oracle DB 是否支持每个连接的多个(并行)操作?

java - Tomcat8 org.apache.cxf.BusFactory.getBusFactoryClass 无法确定 BusFactory 实现类名

java - 没有堆栈跟踪的线程异常

java - 带监听器的单例与连接

c++ - boost::asio::io_service 是否保留处理程序的顺序?