java - 使用 Java CompletableFuture 方法时的同步行为

标签 java asynchronous spring-boot executorservice completable-future

我正在像这样在 Spring Boot 中使用 Java 的 CompletableFuture @Service:

@Service
public class ProcessService {

    private static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(3);

    @Autowired
    ChangeHistoryService changeHistoryService;

    public Attribute process(Attribute attribute) {
        //some code

        CompletableFuture.runAsync(() -> changeHistoryService.logChanges(attribute), EXECUTOR);

        return attribute;
    }

}

@RestController 内的方法调用 process 方法:

@RestController
public class ProcessController {


    @Autowired
    ProcessService processService;

    @RequestMapping(value = "/processAttribute",
            method = {RequestMethod.POST},
            produces = {MediaType.APPLICATION_JSON_VALUE},
            consumes = {MediaType.APPLICATION_JSON_VALUE})
    public Attribute applyRules(@RequestBody Attribute attribute) {

        Attribute resultValue = processService.service(attribute);

        return resultValue;
    }

}

ChangeHistoryService::logChanges 仅根据其参数将一些数据保存到数据库中。 我有一个微服务,它向这个“/processAttribute”端点发出多个请求并打印所有响应。

当我在 logChanges 方法中放置断点时,微服务正在等待某些请求,但不是所有请求,这让我认为 ChangeHistoryService::logChanges 并不总是异步运行。如果我不为 runAsync 提供 ExecutorService,微服务会阻塞更多请求,但仍然不是全部。 据我了解,这是因为处理请求的方法和 logChanges 方法共享相同的线程池(ForkJoinPool?)。 无论如何,由于我有另一个 ExecutorService,logChanges 不应该独立运行吗?或者是关于 IDE 如何处理异步任务上的断点?我正在使用 IntelliJ IDEA。

最佳答案

问题是断点挂起所有线程,而不仅仅是运行 logChanges 方法的线程。我在 Intellij IDEA 中通过右键单击断点并选中“线程”复选框而不是“全部”来修复此问题:

enter image description here

关于java - 使用 Java CompletableFuture 方法时的同步行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263227/

相关文章:

java - JPA GenerationType.IDENTITY 不考虑在 MS SQL 中自动递增的列

java - 我如何从命令行同时运行多个java程序/类(或者这是不可能的)?

javascript - Foreach 在 foreach 中,结果为空,可能是因为异步调用

javascript - Async/Await 在 ASP.NET Core Controller 操作中没有按预期工作

java - Spring Data Neo4j - 关系实体的(所有)属性

java - 当我使用 java 11 时,将 java 应用程序部署到 heroku 时遇到问题

java - 修复记录: Cell information from worksheet created

javascript - 异步在 Ajax 中意味着什么?

java - SpringBoot 2迁移ConfigurationProperties无法将属性绑定(bind)到String[]

java - android 媒体播放器库出现问题