我正在尝试异步运行繁重的任务。客户端然后轮询服务器以了解作业何时完成。这似乎可行,但我注意到当我在 @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 // 在数据库中创建作业,启动它并返回它的 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 服务,尽管它是异步运行的?