Как заставить spring-boot @Async работать с Java 8 - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь вызвать метод асинхронно.Но почему-то это не работает.Может ли кто-нибудь помочь мне решить эту проблему?

Моя основная точка входа:

@SpringBootApplication
@EnableAsync
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        AsyncService asyncService = new AsyncService();
        asyncService.asyncMethod();
        asyncService.asyncMethod();
    }

}

Асинхронная служба:

@Component
public class AsyncService {

    @Async
    public void asyncMethod(){

        log.info("starting...");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("ending...");
    }
}

И, наконец, в журнале я ожидаю:

  1. начало ...
  2. начало ...
  3. окончание ...
  4. окончание ...

но вот что я получаю:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.2.RELEASE)

2019-02-13 17:52:41.548  INFO 85734 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication on mntbden00122972 with PID 85734 (/Users/h3560/demo/target/classes started by h3560 in /Users/h3560/demo)
2019-02-13 17:52:41.550  INFO 85734 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2019-02-13 17:52:42.084  INFO 85734 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 0.76 seconds (JVM running for 1.329)
2019-02-13 17:52:42.086  INFO 85734 --- [           main] com.example.demo.services.AsyncService   : starting...
2019-02-13 17:52:44.088  INFO 85734 --- [           main] com.example.demo.services.AsyncService   : ending...
2019-02-13 17:52:44.089  INFO 85734 --- [           main] com.example.demo.services.AsyncService   : starting...
2019-02-13 17:52:46.091  INFO 85734 --- [           main] com.example.demo.services.AsyncService   : ending...

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Проблема, с которой вы сталкиваетесь, заключается в создании экземпляра объекта вручную с помощью оператора new.Это не дает фреймворку возможности обернуть объект в прокси.Если вы хотите использовать асинхронные методы, вы должны использовать Spring DI от Factory Methos, @Autowired (или @Inject) или с использованием конфигураций XML.

Если вы делаете это таким образом, вы можете сделать System.out.println(obj.getClass()) чтобы увидеть, что бобы под капотом, в которые вводят DI, относятся не к тому классу, который вы там использовали, а к прокси.

0 голосов
/ 13 февраля 2019

@Async - это аннотация Spring, которая применяется к public методам на прокси (поэтому они должны быть публичными).Самостоятельное обращение не работает.

В вашем примере вы не используете механизм внедрения зависимостей из пружины, поэтому прокси не создается.Чтобы обойти его, вам нужно сделать из него @Bean (что вы сделали, пометив его @Component) и @Autowire перед выполнением:

@SpringBootApplication
@EnableAsync
public class DemoApplication {

@Autowired
AsyncService asyncService;

    public someMethod() {
        SpringApplication.run(DemoApplication.class, args);
        asyncService.asyncMethod();
        asyncService.asyncMethod();
    }

}

С этой пружиной AOP можетоберните компонент в прокси и выполните метод асинхронно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...