簡體   English   中英

Spring Boot @Async 方法同步執行

[英]Spring Boot @Async method executing synchronously

這與此處的另一個問題非常相似: 控制器中的 Spring Boot @Async 方法正在同步執行 但是我用@Async注釋的@Service方法仍在同步執行。 我已經嘗試了來自不同論壇的所有方法都沒有用。 希望有人能幫我找出原因。 下面的一個簡單的彈簧啟動項目不起作用。

異步配置文件

@Configuration
@EnableAsync
public class AsyncConfiguration(){}

SomeService.java

@Service
public class SomeService() {
  @Async
  public void doSomething() {
    try {
      Thread.sleep(5000L);
    } catch (Exception ignore){}
  }
}

一些控制器.java

@Controller
public class SomeController() {

  @Inject SomeService someService;

  @RequestMapping(value="/", method=RequestMethod.POST)
  public String doStuff() {
    someService.doSomething();
    return "mytemplate";
  }
}

這是@Async 的一個簡單示例。 按照以下步驟讓 @Async 在您的 Spring Boot 應用程序中工作:

步驟1:添加@EnableAsync注解並將TaskExecutor Bean添加到應用程序類。

例子:

@SpringBootApplication
@EnableAsync
public class AsynchronousSpringBootApplication {

    private static final Logger logger = LoggerFactory.getLogger(AsynchronousSpringBootApplication.class);

    @Bean(name="processExecutor")
    public TaskExecutor workExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setThreadNamePrefix("Async-");
        threadPoolTaskExecutor.setCorePoolSize(3);
        threadPoolTaskExecutor.setMaxPoolSize(3);
        threadPoolTaskExecutor.setQueueCapacity(600);
        threadPoolTaskExecutor.afterPropertiesSet();
        logger.info("ThreadPoolTaskExecutor set");
        return threadPoolTaskExecutor;
    }

    public static void main(String[] args) throws Exception {
  SpringApplication.run(AsynchronousSpringBootApplication.class,args);
 }
}

第 2 步:添加執行異步進程的方法

@Service
public class ProcessServiceImpl implements ProcessService {

    private static final Logger logger = LoggerFactory.getLogger(ProcessServiceImpl.class);

    @Async("processExecutor")
    @Override
    public void process() {
        logger.info("Received request to process in ProcessServiceImpl.process()");
        try {
            Thread.sleep(15 * 1000);
            logger.info("Processing complete");
        }
        catch (InterruptedException ie) {
            logger.error("Error in ProcessServiceImpl.process(): {}", ie.getMessage());
        }
    }
}

第三步:在Controller中添加API來執行異步處理

@Autowired
private ProcessService processService;

@RequestMapping(value = "ping/async", method = RequestMethod.GET)
    public ResponseEntity<Map<String, String>> async() {
        processService.process();
        Map<String, String> response = new HashMap<>();
        response.put("message", "Request is under process");
        return new ResponseEntity<>(response, HttpStatus.OK);
    }

我還在 GitHub 上用這些步驟寫了一個博客和一個工作應用程序。 請查看: http : //softwaredevelopercentral.blogspot.com/2017/07/asynchronous-processing-async-in-spring.html

對不起我的英語不好。 同樣的問題發生在我身上。 解決方案是添加

@Autowired
private SomeService someService;

在Controller類中,通過這種方式,它允許類包含與“SomeService”相關聯的Beam Configurations,從而能夠完美地執行異步方法。

這是一個具有功能性異步方法的項目: https : //github.com/JColmenares/async-method-api-rest.git

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM