当@Asynchronous方法工作时,为什么RestEasy Web服务被阻止?
我正在尝试异步运行繁重的任务。然后,客户机轮询服务器,以了解作业何时完成。这似乎有效,但我注意到当我在@Asynchronous方法中设置断点时,响应轮询的Web服务被阻止 这就是我所做的: JobWS.java//用于启动作业当@Asynchronous方法工作时,为什么RestEasy Web服务被阻止?,asynchronous,jakarta-ee,ejb,resteasy,wildfly-11,Asynchronous,Jakarta Ee,Ejb,Resteasy,Wildfly 11,我正在尝试异步运行繁重的任务。然后,客户机轮询服务器,以了解作业何时完成。这似乎有效,但我注意到当我在@Asynchronous方法中设置断点时,响应轮询的Web服务被阻止 这就是我所做的: JobWS.java//用于启动作业 @RequestScoped @Path("/job") @Produces(MediaType.APPLICATION_JSON) public class JobWS { @POST @Path("/run/create") public
@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//在数据库中创建作业,启动它并返回其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
}
}
最后是我的轮询Web服务,它被阻止了
@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()中的某个位置放置断点,轮询WS将不再响应HTTP请求。当我通过doWork()进行调试时,偶尔会收到响应,但只有在从一个断点跳到另一个断点时,在断点处等待时从不响应
我错过了什么?为什么我的doWork()方法会阻止我的Web服务,尽管它是异步运行的?我找到了罪魁祸首默认情况下,断点挂起所有线程。在IntelliJ中,右键单击它将打开以下对话框: 当将“Suspend”属性更改为“Thread”时,我的WS不再被阻塞,一切正常。回想起来,我觉得问这个问题有点愚蠢。但是嘿。。。也许它会帮助其他人:)