Nano Hash - криптовалюты, майнинг, программирование

Spring MVC, как получить ход выполнения асинхронной задачи

Я хотел бы запустить асинхронную задачу из контроллера, как в следующем фрагменте кода из документации Spring.

import org.springframework.core.task.TaskExecutor; 

public class TaskExecutorExample { 

  private class MessagePrinterTask implements Runnable { 

    private int cn; 

    public MessagePrinterTask() { 

    } 

    public void run() { 
//dummy code 
for (int i = 0; i < 10; i++) { 
cn = i; 
} 
} 

} 

private TaskExecutor taskExecutor; 

public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
  } 

  public void printMessages() { 

      taskExecutor.execute(new MessagePrinterTask()); 

  } 
} 

после этого в другом запросе (в случае, если эта задача выполняется) мне нужно проверить ход выполнения задачи. В основном получить значение cn.

Что было бы лучшим подходом в Spring MVC, как избежать проблем с синхронизацией.

Спасибо

Пепа Прохазка


Ответы:


1

Вы видели аннотацию @Async в справочный документ Spring?

Сначала создайте bean-компонент для вашей асинхронной задачи:

@Service
public class AsyncServiceBean implements ServiceBean {

    private AtomicInteger cn;

    @Async
    public void doSomething() { 
        // triggers the async task, which updates the cn status accordingly
    }

    public Integer getCn() {
        return cn.get();
    }
}

Далее вызываем его из контроллера:

@Controller
public class YourController {

    private final ServiceBean bean;

    @Autowired
    YourController(ServiceBean bean) {
        this.bean = bean;
    }

    @RequestMapping(value = "/trigger")
    void triggerAsyncJob() {
        bean.doSomething();
    }

    @RequestMapping(value = "/status")
    @ResponseBody
    Map<String, Integer> fetchStatus() {
        return Collections.singletonMap("cn", bean.getCn());
    }        
}

Не забудьте настроить исполнителя соответствующим образом, например

<task:annotation-driven executor="myExecutor"/>
<task:executor id="myExecutor" pool-size="5"/>
05.06.2012
  • Конечно, вы можете использовать @Autowired, @Inject или любой другой метод Spring DI, который вы обычно используете. 05.12.2012
  • Из Справочные документы Spring: По умолчанию при указании @Async в методе будет использоваться исполнитель, указанный в элементе, управляемом аннотациями 05.12.2012
  • Спасибо, я реализовал пример и использую цикл в функции triggerAsyncJob, но запускается только один поток. Мне нужно выполнить как минимум 5 одновременно. Я должен настроить что-нибудь еще? 05.12.2012
  • Это хорошая реализация, но мне кажется, что это будет работать только для одного экземпляра выполняемой задачи. Есть ли способ иметь несколько раз одну и ту же задачу, например, processFile, вызываемую более чем одним пользователем, и иметь прогресс для каждого пользователя? 24.01.2018

  • 2

    Одним из решений может быть: в вашем асинхронном потоке напишите в БД, и пусть ваш код проверки проверяет таблицу БД на предмет прогресса. Вы получаете дополнительное преимущество в виде сохранения данных о производительности для последующей оценки.

    Кроме того, просто используйте аннотацию @Async, чтобы запустить асинхронный поток — это упрощает жизнь и является Spring Way To Do It.

    05.06.2012
  • Спасибо, это была моя первая идея, но мне нужно только показать прогресс, и я не хочу сохранять какую-либо информацию. Теперь я регистрирую прогресс в журнале tomcat, и я хочу иметь более быстрый способ, как это проверить. 06.06.2012

  • 3

    Игнорируя проблемы с синхронизацией, вы можете сделать что-то вроде этого:

      private class MessagePrinterTask implements Runnable { 
        private int cn; 
    
        public int getCN() {
          return cn;
        }
    
        ...
      }
    
    
      public class TaskExecutorExample { 
        MessagePrinterTask printerTask;
    
        public void printMessages() { 
          printerTask = new MessagePrinterTask();
          taskExecutor.execute(printerTask); 
        }
        ...
      }
    
    05.06.2012
  • привет, как вы получаете TaskExecutor? Я видел, что это взято из контекста с использованием .xml. Не могли бы вы подробнее объяснить свое решение? 05.12.2012

  • 4

    Проверьте этот источник github, он дает довольно простой способ определения статуса фонового задания с помощью @Async of Spring mvc.

    введите описание изображения здесь https://github.com/frenos/spring-mvc-async-progress/tree/master/src/main/java/de/codepotion/examples/asyncExample

    25.04.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..