我有一个带有以下方法代码的Web服务:

private static Semaphore reacted = new Semaphore(0);

@Path("/p1")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public UserDefinedClass postMethod1( UserDefinedClass udc) {
   If (Condition A)
      semaphore.acquire();

   System.out.println("Test");

   UserDefinedClass u = new UserDefinedClass(udc);
   return u;
}

@Path("/p2")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void postMethod2(UserDefinedClass udc) throws IOException {
    ...
    reacted.release();
}


如果没有发生条件A,则服务将正确地回复到调用环境(将其命名为CE),但是,如果条件A为true,则postMethod1方法将阻塞,等待有人调用postMethod2。

如果有人致电postMethod2(从CE致电postMethod1不到1分钟)。 postMethod1不受阻碍,但是,在semaphore.acquire();下面的代码永远不会执行,并且不会打印出“测试”消息,而是在CE中出现以下错误:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/html;charset=utf-8, type=class...


请注意,如果条件A不成立,则CE中不会显示任何错误。这意味着问题不在于方法定义,而是因为方法的线程进入等待信号量的等待状态。

CE代码为:

    UserDefinedClass udc = new UserDefinedClass();

    ClientConfig config = new ClientConfig(JacksonJsonProvider.class);
    Client client = ClientBuilder.newClient(config);

    String targetUrl = "http://localhost:8080/myApp";

    WebTarget target = client.target(targetUrl);
    Invocation.Builder invocationBuilder = target.path("rest").
            path("p1").
            request(MediaType.APPLICATION_JSON);
    Response response = invocationBuilder.post(Entity.entity(udc, MediaType.APPLICATION_JSON));
    UserDefinedClass u = response.readEntity(UserDefinedClass.class);


那么可能是什么问题呢?

最佳答案

我不知道该怎么用您的脚本语言来做,但是内容类型text/html是错误的。

我也不确定这是响应还是请求部分,但它不匹配或未正确设置APPLICATION_JSON

您应该可以通过调查实际的网络流量来轻松解决此问题(为此我使用ngrep,但其他人更喜欢tcpdump)。

关于java - 为什么RESTful Web服务不能正确调用semaphore.acquire()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52650540/

10-14 08:47