如何在Spring TaskExecutor中分配任务名称并检查它是否仍然存在?

时间:2011-09-14 22:21:05

标签: java spring java-ee spring-mvc concurrency

请考虑我有以下内容:

public class MyRunnable implements Runnable {
    public void run() {
        //do something expensive
    }
}

public class ThreadExecutor {

      private TaskExecutor taskExecutor;
    public ThreadExecutor(TaskExecutor taskExecutor) {
        this.taskExecutor = taskExecutor;
    }

    public void fireThread(){
        taskExecutor.execute(new MyRunnable());
    }
}

我的xml如下:

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <property name="corePoolSize" value="5" />
  <property name="maxPoolSize" value="10" />
  <property name="queueCapacity" value="25" />
</bean>

<bean id="threadExecutor" class="com.vanilla.threads.controllers.ThreadExecutor">
    <constructor-arg ref="taskExecutor" />
</bean>

在我的Spring MVC控制器中,我开始执行任务:

@RequestMapping(value="/startTask.html", method=RequestMethod.GET)
    public ModelAndView indexView(){
        ModelAndView mv = new ModelAndView("index");
        threadExecutor.fireThread();
    return mv;
    }

现在让我们考虑一下我想创建另一个请求(@RequestMapping(value="/checkStatus.html"),它将告诉我先前请求中启动的任务是否已经完成。

所以我的问题很简单:

1)我可以在TaskExecutor中为任务指定名称吗?如果是,我该怎么办?

2)如何检查具有该特定名称的任务是否已完成?

1 个答案:

答案 0 :(得分:3)

1)不,但是..

而不是使用taskExecutor.execute()使用taskExecutor.submit()返回Future。将Future放入HttpSession,当checkStatus请求进入时,从会话中提取Future并在其上调用isDone()。如果您需要为其命名,那么不要将Future直接放在会话中,而是在会话中有一个Map<String, Future>,其中键是您的任务名称。