2016-10-21 2 views
1

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

У меня есть webapp, который в основном просто наводняет запросы на другие webapps (некоторые базовые нагрузки и обнаружение сбоев). Реализация реквестера полностью асинхронизирована (у него тоже есть встроенный асинхронный исполнитель). Веб-приложение также имеет периодическую работу, но не надежно выполняет свою работу в течение 2-минутного таймфрейма. Это все еще хорошо. НО.

Когда я начал использовать мою описанную выше lib на вторично описанном сервере, lib начинает работать ненадежным. Это не срабатывает каждые 2 минуты. У меня недостаточно знаний о весне, чтобы узнать, почему.

Мое лучшее решение - метод наводнений на серверах запускает множество асинхронных задач, и планировщик также запускает эти задачи, и эти запросы идут в одну очередь сообщений.

Есть ли способ отделить запланированные задачи от запланированных задач от других серверов и сделать их надежными каждые 2 минуты?

+0

Не мог бы вы поделиться кодом, как вы настроили выполнение задач и конфигурацию, связанные с планировщиком Вы можете посмотреть в это, если это помогает http://stackoverflow.com/a/21409068/3838328 – Kamal

+0

Я далек от своего кода сейчас, но это приложение для весенней игры. Я думаю, этого было бы достаточно, если бы я мог определить в моем lib разделенного Executor. Я думаю, что [this] (http://stackoverflow.com/questions/32207023/multiple-threadpooltaskexecuters-spring-java-config) будет решать мою проблему, но я не уверен и не могу попробовать это прямо сейчас, возможно завтра :) – tg44

ответ

0

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

Так что моя реализация - это что-то вроде этого, чтобы разделить 2 threadpool.

@SpringBootApplication 
@EnableAsync 
@EnableScheduling 
@ComponentScan 
public class WebService extends AsyncConfigurerSupport implements SchedulingConfigurer { 
public static void main(String[] args) { 
    System.setProperty("http.proxyHost", "localhost"); 
    System.setProperty("http.proxyPort", "8888"); 
    System.setProperty("spring.config.name", "web-server"); 
    SpringApplication.run(WebService.class, args); 
} 
@Override 
public Executor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(2); 
    executor.setMaxPoolSize(4); 
    executor.setQueueCapacity(500); 
    executor.setThreadNamePrefix("tester-"); 
    executor.initialize(); 
    return executor; 
} 
@Bean(destroyMethod = "shutdown", name = "scheduledExecutor") 
public Executor taskExecutor() { 
    return Executors.newScheduledThreadPool(100); 
} 

@Autowired 
@Qualifier(value="scheduledExecutor") 
Executor scheduledExecutor; 

@Override 
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
    taskRegistrar.setScheduler(scheduledExecutor); 
} 

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

Смежные вопросы