2016-12-01 2 views
1

Мне нужно сделать что-то, что я не знаю, что является лучшей практикой для этого.Spring Task Async и Delayed

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

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

Приложение SpringBoot APP, и я рассматривал возможность использования аннотаций @EnableAsync и @Async для сервисного метода со временем сна.

@Configuration 
@EnableAsync 
public class AsyncConfiguration implements AsyncConfigurer { 

    @Override 
    public Executor getAsyncExecutor() { 

     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(2); 
     executor.setMaxPoolSize(10); 
     executor.setQueueCapacity(500); 
     executor.setThreadNamePrefix("TIMCLL-"); 
     executor.initialize(); 
     return executor; 

    } 

    @Override 
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

. . .

@Async 
public void verifyStatusTimPayment() throws InterruptedException { 

    Thread.sleep(5000); 
    logger.info("Executed after 5s " + new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date())); 

} 

Проверка должна быть выполнена через 15 минут после запроса и должна произойти только один раз за запрос.

Как это сделать без создания Thread.sleep ?????

ответ

1

Вы могли использовать ScheduledExecutorService запланировать задачу

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
... 
scheduler.schedule(() -> {yourtaskhere}, 15, TimeUnit.MINUTES); 

Но это не то, что вы хотите. Что делать, если сервер умирает между планированием задачи и ее исполнением? вы потеряете свою задачу. Было бы лучше, если бы вы сохраняли сообщение в очереди и извлекали его позже или использовали любой планировщик, который использует постоянство (a la Quartz)