代码之家  ›  专栏  ›  技术社区  ›  Tim

当我的@Asynchronous方法工作时,为什么我的RestEasy WebService被阻塞?

  •  0
  • Tim  · 技术社区  · 7 年前

    我在努力完成繁重的任务 异步 . 然后,客户机轮询服务器以了解作业何时完成。这似乎有效,但我注意到 响应轮询的我的WebService被阻止 当我在@Asynchronous方法中放置断点时。

    我就是这么做的:

    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
            }
    
    }
    

    工人.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()中设置了一个断点somwhere, PollingWS不再响应HTTP请求 . 当我通过doWork()进行调试时,偶尔会得到一个响应,但只有在从一个断点跳到另一个断点时, 从不在断点处等待 .

    我错过了什么?为什么我的doWork()方法会阻塞我的Webservice,尽管它是异步运行的?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tim    7 年前

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

    Breakpoint properties

    当将“Suspend”属性更改为“Thread”时,我的WS不再被阻止,一切都按预期工作。回想起来,我觉得问这个有点傻。但是嘿。。。或许它能帮助其他人:)