首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步注释在SpringBoot中不适用于我

异步注释在SpringBoot中不适用于我
EN

Stack Overflow用户
提问于 2022-06-27 17:15:00
回答 1查看 104关注 0票数 0

@异步不适合我,尝试过多次调试它,但是api在同一个线程中运行。

我是在配置中遗漏了什么,还是在组件之间存在某种相互作用,而我看不到这些组件?

我通过使用固定时间间隔调用相同的api 2-3次进行调试,但它们都运行在同一个线程中。

配置类:

代码语言:javascript
复制
@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean("threadPoolTaskExecutor")
    public TaskExecutor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("AsyncThread-");
        executor.initialize();
        return executor;
    }

}

方法,其中我要应用异步。

代码语言:javascript
复制
@Async("threadPoolTaskExecutor")
    public static CompletableFuture<Object> getExecutionDatafromDb() {
        long start = System.currentTimeMillis();

        Object executionData = "";

        db = mongoClient.getDatabase(database);

        collection = db.getCollection("executiondata");

        Document data = null;
        BasicDBObject whereQuery = new BasicDBObject();
        Document document = new Document();

        ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
        String json = null;

        whereQuery.put(MACHINE_ID, 8);
        whereQuery.put(PROJECT_ID, 121);
        iterDoc = collection.find(whereQuery).cursor();

        try {
            if (iterDoc.hasNext()) {
                data = iterDoc.next();
                executionData = data.get("execution_data");
            } else {
                executionData = createExecutionDataJson();
                document.put("execution_data", executionData);
                document.put(MACHINE_ID, machineId);
                document.put(PROJECT_ID, projectId);
            }

        } catch (Exception e) {
            throw new BusinessException("605",
                    "Something went wrong in Service layer while fetching Execution Data From Db" + e.getMessage());
        }

        logger.info("Fecthing data "+Thread.currentThread().getName());
        try {
            json = ow.writeValueAsString(executionData);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } finally {
            iterDoc.close();

        }
        long end = System.currentTimeMillis();
        logger.info("Total time {}", (end - start));
 
        return CompletableFuture.completedFuture(json);
    }

我想要点击的Api:

代码语言:javascript
复制
@SuppressWarnings("static-access")
@GetMapping(value = "/getExecutionDataByThread", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity getExecutionDataByThread() {
    
    Object result1 = asyncService.getExecutionDatafromDb();
    sleep(2); // for demonstration
    Object result2 = asyncService.getExecutionDatafromDb();
    sleep(2);
    Object result3 = asyncService.getExecutionDatafromDb();
    

    return ResponseEntity.status(HttpStatus.OK).build();
    
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-27 17:24:12

异步方法的工作方式是将对象与带注释的方法包装在代理中,该代理从池中获取线程并在其上执行任务。这对于spring托管对象的方法是有效的,对于静态方法则不起作用。使该方法成为实例方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72775994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档