代码之家  ›  专栏  ›  技术社区  ›  Marci-man

如何让sping boot@Async与Java 8协同工作

  •  0
  • Marci-man  · 技术社区  · 5 年前

    我正在尝试异步调用方法。但不知怎的它不起作用。有人能帮我解决这个问题吗?

    @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. 结束。。。

    但我得到的是:

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: 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...
    
    0 回复  |  直到 5 年前
        1
  •  7
  •   Andronicus    5 年前

    @Async 是应用于 public

    在您的示例中,您没有使用来自spring的依赖注入机制,因此没有创建代理。要绕过它,你需要 @Bean 从它(你已经做了注释 @Component @Autowire 执行前:

    @SpringBootApplication
    @EnableAsync
    public class DemoApplication {
    
    @Autowired
    AsyncService asyncService;
    
        public someMethod() {
            SpringApplication.run(DemoApplication.class, args);
            asyncService.asyncMethod();
            asyncService.asyncMethod();
        }
    
    }
    

    通过这个spring,AOP可以将组件包装成代理,并异步执行该方法。

        2
  •  3
  •   Adrian Jałoszewski    5 年前

    new @Autowired (或 @Inject )或者使用XML配置。

    System.out.println(obj.getClass()) ,要知道,在hood下注入DI的bean不是您在那里使用的类,而是代理类。