【发布时间】:2016-02-03 13:18:27
【问题描述】:
我正在开发 Spring MVC Web 应用程序。它的功能之一是文件转换(上传文件 -> 转换 -> 存储在服务器上)。 有些文件可能太大而无法即时转换,所以我决定在上传后将它们放在共享队列中。 文件将根据上传时间优先转换,即FIFO。
我的想法是在上传后将任务添加到控制器中的队列中。 还会有服务执行队列中的所有任务,如果为空,则等待添加新任务。我不需要调度 - 任务应该总是在队列不为空时执行。
我已阅读有关 ExecutorService 的信息,但没有找到适合我的案例的任何示例。
如果有任何建议,我将不胜感激。
编辑 感谢您的回答,我需要澄清我的问题: 基本上,我知道如何执行任务,我需要通过处理任务队列来管理。用户应该能够查看队列并暂停、恢复或从队列中删除任务。 我的任务类:
public class ConvertTask implements Callable<String> {
private Converter converter;
private File source;
private File target;
private State state;
private User user;
public ConvertTask(Converter converter, File source, File target, User user) {
this.converter = converter;
this.source = source;
this.target = target;
this.user = user;
this.state = State.READY;
}
@Override
public String call() throws Exception {
if (this.state == State.READY) {
BaseConverterService converterService = ConverterUtils.getConverterService(this.converter);
converterService.convert(this.source, this.target);
MailSendServiceUtil.send(user.getEmail(), target.getName());
return "success";
}
return "task not ready";
}
}
我还根据您的建议创建了负责管理队列/任务的类:
@Component
public class MyExecutorService {
private LinkedBlockingQueue<ConvertTask> converterQueue = new LinkedBlockingQueue<>();
private ExecutorService executorService = Executors.newSingleThreadExecutor();
public void add(ConvertTask task) throws InterruptedException {
converterQueue.put(task);
}
public void execute() throws InterruptedException, ExecutionException {
while (!converterQueue.isEmpty()) {
ConvertTask task = converterQueue.peek();
Future<String> statusFuture = executorService.submit(task);
String status = statusFuture.get();
converterQueue.take();
}
}
}
我的观点是,如果队列不为空,如何执行任务,并在添加新任务且队列先前为空时恢复。我想到了一些适合add(ConvertTask task) 方法的代码。
【问题讨论】: