2015-10-23 5 views
0

У меня есть длительный метод обслуживания, который я начинаю с вызова отдыха от контроллера.Spring Boot @Async называется Synchronusly

Услуги:

@Service 
public class TestServiceImpl implements TestService { 

    @Override 
    public void doSomething() { 
     System.out.println("1: " + DateTime.now()); 
     runLongTask(); 
     System.out.println("2: " + DateTime.now()); 

    } 

    @Async 
    private runLongTask() { 
     System.out.println("Test"); 
     Thread.sleep(10000); 
     System.out.println("3: "+ DateTime.now()); 
    } 
} 

В моей Application.java я имею

private int poolSize = 10; 

private int queueCapacity = 10; 

@Bean(name="taskExecutor") 
public TaskExecutor taskExecutor() { 
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); 
    taskExecutor.setMaxPoolSize(this.poolSize); 
    taskExecutor.setQueueCapacity(this.queueCapacity); 
    taskExecutor.afterPropertiesSet(); 
    return new ThreadPoolTaskExecutor(); 
} 

И, конечно, у меня есть @EnableAsync аннотацию в моем классе Application.java

Так что я бы ожидать, что выход такой:

1: 2015-10-23 11:20:00 
2: 2015-10-23 11:20:01 
Test 
3: 2015-10-23 11:20:11 

ответ

7

вам необходимо вызвать метод из другого класса для использования аннотаций, таких как @Async или @Transactional. Весна делает это, обертывая аннотированные методы прокси. В случае, когда вы вызываете метод из того же класса, это не имеет никакого эффекта.

1

Согласно documentation вам нужно реализовать интерфейс AsyncConfigurer в вашем Configuration класса (в данном случае я предполагаю ваш Application экземпляр), чтобы переопределить SimpleAsyncTaskExecutor.

Полный пример также показан в документации:

@Configuration 
@EnableAsync 
public class AppConfig implements AsyncConfigurer { 

@Bean 
public MyAsyncBean asyncBean() { 
    return new MyAsyncBean(); 
} 

@Override 
public Executor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(7); 
    executor.setMaxPoolSize(42); 
    executor.setQueueCapacity(11); 
    executor.setThreadNamePrefix("MyExecutor-"); 
    executor.initialize(); 
    return executor; 
} 

@Override 
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
     return MyAsyncUncaughtExceptionHandler(); 
} 
} 

HTH,

Хосе Луис

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