当我的@Asynchronous方法有效时,为什么我的RestEasy WebService被阻止?

时间:2018-08-03 13:11:55

标签: asynchronous java-ee ejb resteasy wildfly-11

我正在尝试异步运行繁重的任务。然后,客户端将轮询服务器以了解作业何时完成。这似乎可行,但是当我在@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
    }
}

最后,我的轮询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()中放置了一个断点,则 PollingWS不再响应HTTP请求。当我通过doWork()进行调试时,偶尔会收到响应,但是仅当从一个断点跳到另一个断点时,在断点处等待时永远不会

我在这里想念什么?为什么我的doWork()方法阻止了我的Web服务,尽管它异步运行?

1 个答案:

答案 0 :(得分:0)

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

Breakpoint properties

将“挂起”属性更改为“线程”时,我的WS不再受阻,一切正常。回想起来,我对此提出要求有点愚蠢。但是,嘿...也许对其他人有帮助:)