Как назначить имя задачи в Spring TaskExecutor и проверить, живо ли оно? - PullRequest
2 голосов
/ 15 сентября 2011

Дабы посчитать, что у меня есть следующее:

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 Ответ

3 голосов
/ 15 сентября 2011

1) Нет, но ..

Вместо использования taskExecutor.execute() используйте taskExecutor.submit(), который возвращает Future. Поместите Future в HttpSession, и когда поступит запрос checkStatus, извлеките Future из сеанса и вызовите isDone(). Если вам нужно дать ему имя, то вместо того, чтобы поместить Future в сеанс, прямо укажите Map<String, Future> в сеансе, где ключ - это имя вашей задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...