Почему веб-сервис RESTful не может правильно вызвать semaphore.acquire ()? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть веб-сервис со следующим кодом метода:

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 верно, метод postMethod1 блокирует ожидание того, чтобы кто-нибудь вызвал postMethod2.

Если кто-то вызывает postMethod2 (в течение 1 минуты после вызова CE для postMethod1).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);

Так что можетбыть проблемой?!

1 Ответ

0 голосов
/ 04 октября 2018

Я не знаю, как это сделать на вашем языке сценариев, но тип содержимого text/html неправильный.

Я также не уверен, является ли это ответом или частью запроса, но она не соответствует илиправильно установлен APPLICATION_JSON.

Вы легко сможете решить эту проблему, исследуя реальный сетевой трафик (для этого я использую ngrep, но другие предпочитают tcpdump).

...