簡體   English   中英

在不阻塞主線程的情況下異步調用方法調用

[英]Invoke method call asynchronously without blocking main thread

我有一個場景,spring-boot 應用程序必須從下游應用程序下載文件並將其傳遞給客戶端。 API 還需要在不阻塞響應(主線程)的情況下更新數據庫中的讀取標志。

一個基本的異步用例是我在各自的 API 中想到並實現的。 但是,我遇到了@Async 的行為問題。 注釋能夠產生一個新線程,但它阻塞了主線程並持有響應。 期望是在不持有主線程的情況下返回。 實際上,異步更新是主線程的最后一個操作,我猜是因為@Async 阻塞了主線程。

任何人都可以建議這種情況的更好解決方案。

調用 class

ResponseEntity<byte[]> parsedResponse = retrieverService.retrieve(id,"html");

retrieverService.update(id);

return parsedResponse;

異步方法

@Override
@Async("updateTaskExecutor")
public void update(String id) {
    LOG.info("Updating data for metaTagId: {}", id);
    db.updateReadFlag(id);
}

異步配置

@Configuration
@EnableAsync
public class AsyncConfiguration {

    @Bean(name = "updateTaskExecutor")
    public Executor updateTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(100);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("UpdateTaskClient-");
        executor.initialize();
        return executor;
    }
}

配置是正確的。 我正在使用調試器來檢查並行度。 正如@M 所建議的那樣。 Deinum,它不是檢查並行性的正確方法。 使用 Thread.sleep() 后,我可以看到異步調用按預期工作。 我能夠在異步執行更新查詢的同時發回響應。

暫無
暫無

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

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