为什么我的 RestEasy WebService 在我的 @Asynchronous 方法工作时被阻止?

Why is my RestEasy WebService blocked when my @Asynchronous method is working?

我正在尝试 运行 繁重的任务 异步 。然后客户端轮询服务器以了解作业何时完成。这似乎可行,但我注意到当我在我的@Asynchronous 方法中放置断点时,我响应轮询的 WebService 被阻止

这是我做的:

JobWS.java // 用于开始作业

@RequestScoped
@Path("/job")
@Produces(MediaType.APPLICATION_JSON)
public class JobWS {

    @POST
    @Path("/run/create")
    public Response startJob(MyDTO dto) {
        return ResponseUtil.ok(jobService.createJob(dto));
    }

}

JobService.java // 在数据库中创建作业,启动它并 returns 它的 ID

@Stateless
public class JobService {

    @Inject
    private AsyncJobService asyncJobService;

    @Inject
    private Worker worker;

        public AsyncJob createJob(MyDTO dto) {
            AsyncJob asyncJob = asyncJobService.create();
            worker.doWork(asyncJob.getId(), dto);
            return asyncJob; // With this, the client can poll the job with its ID
        }

}

Worker.java // 努力工作

@Stateless
public class Worker {

    @Asynchronous
    public void doWork(UUID asyncJobId, MyDTO dto) {
        // Do work
        // ...
        // Eventually update the AsyncJob and mark it as finished
    }
}

最后,我的 Polling Webservice,也就是被屏蔽的那个

@RequestScoped
@Path("/polling")
@Produces(MediaType.APPLICATION_JSON)
public class PollingWS {

    @Inject
    AsyncJobService asyncJobService;

    @GET
    @Path("/{id}")
    public Response loadAsyncJob(@PathParam("id") @NotNull UUID id) {
        return ResponseUtil.ok(asyncJobService.loadAsyncJob(id));
    }
}

如果我在 doWork() 的某处放置一个断点,PollingWS 不再响应 HTTP 请求。当我通过 doWork() 进行调试时,偶尔会得到响应,但只有在从一个断点跳到另一个断点时才会得到响应,在断点处等待时从不响应

我在这里错过了什么?为什么我的 doWork() 方法阻塞了我的 Web 服务,尽管它 运行 是异步的?

我找到了罪魁祸首。 断点默认挂起所有线程。在 IntelliJ 中,右键单击它会打开以下对话框:

将 "Suspend" 属性 更改为 "Thread" 时,我的 WS 不再受阻,一切正常。回想起来,我觉得问这个问题有点愚蠢。但是,嘿......也许它会对其他人有所帮助:)