Я создаю Spring 4 Rest API для сайта автоматизации торговли.Весна 4 Задача производительности TaskScheduler
В уровне услуг cronjob динамически создаются с использованием Spring TaskScheduler.schedule(Runnable arg0, Date arg1)
интерфейса, который будет создавать Runnable
, которая должна быть выполнена в то время, указанное в качестве параметра, ровно один раз. Этот поток вызовет другую услугу для доступа к моему слою DAB Hibernate и сделает что-то в будущем.
Класс конфигурации и реализация приведены ниже.
@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan("com.example")
public class SpringMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
return new ThreadPoolTaskScheduler();
}
}
@Service
public class TransactionServiceImp implements TransactionService {
@Autowired
private TaskScheduler scheduler; //org.springframework.scheduling.TaskScheduler;
@Autowired
private TaskExecutorService taskService; //My service
@Transactional
public myFunction(){
//some code
final Long key = //some id value from db
Date exeTime = //some java.util.Date in future
Runnable runnable = new Runnable() {
private long id = key;
public void run() {
taskService.doSomething(id);
}
};
ScheduledFuture<?> sheduler = scheduler.schedule(runnable, exeTime);
//some code
}
}
Этот код работает отлично и выполняет задачу в точное время и ровно один раз.
С помощью отладки затмения, его обнаружили, что новый демон поток создается каждый раз, когда scheduler.schedule()
называется (при обработке запросов HTTP в Spring MVC). Моя проблема в том,
Является ли мое мышление исправить, что JVM создает новый демон нить на каждом
scheduler.schedule()
вызова (вместо создания нити в дата-время, указанное)?Созданные темы демон все еще показывает
Running
статус в Eclipse, отлаживать даже после того, как задача выполняется. Будет ли нить уничтожена или не законченаrun()
метод?Else, будет ли проблема с производительностью?
Это зависит от того, 'TaskScheduler' вы используете. Также вы можете рассмотреть альтернативу. Когда задание запланировано и ваша JVM выйдет из строя, задача исчезнет, если это не проблема, вы, возможно, будете в порядке. Иначе вы можете посмотреть на что-то вроде кварца. –
Я использую интерфейс 'org.springframework.scheduling.TaskScheduler' и реализацию' org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler'. Сбой JVM и ушедшая задача не являются проблемой, поскольку статус транзакции хранится в db, и он будет проверяться при следующем запуске. –