Запрос на блокировку сервера Jetty - PullRequest
0 голосов
/ 17 июня 2019

Если у меня есть клиент, запрашивающий данные у Jetty Server как таковой:

private static MessageBean fetchMessage(final String host, final int hostPort, final String path) {
  return client.target(String.format("http://%s:%d/%s", host, hostPort, path))
      .request(MediaType.APPLICATION_JSON_TYPE)
      .get(new GenericType<StateMessageBean>() {
      });
}

, тогда я хочу следующее поведение:

Когда логическая переменная имеет значение false, я хочу Jetty Serverничего не отправлять и клиент бесконечно блокировать, пока логическая переменная не станет истинной.Иначе я хочу, чтобы Jetty Server отправлял ответ.

Чтобы лучше понять мой вопрос, код метода сервера я хочу, чтобы он выглядел так:

  @GET()
  @Path("/message")
  @Produces(MediaType.APPLICATION_JSON)
  public MessageBean getMessage() {
    final MyStore<String, String> myMessageStore = ...
    String message = messageStore.readMessage();

    boolean messageState = myMessageStore.readBoolean(); 

    if(messageState)
    return new StateMessageBean(message);
    else
    //return something in order for the client to block infinitely
}

Или естьдругой шаблон, который я пропускаю, чтобы сервер Jetty ничего не отправлял, а клиент ждал?Заранее спасибо.

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете сделать что-то вроде:

while(!messageState) {
    Thread.sleep(1000);
    messageState = myMessageStore.readBoolean();
}

Но это не рекомендуется для веб-серверов, потому что рабочие потоки довольно быстро заканчиваются.Если вы хотите отказать клиенту в обслуживании, вам следует немедленно вернуть 403 или что-то еще.В противном случае вы могли бы УДАЛИТЬ на уровне брандмауэра, но, конечно, подключение этого решения брандмауэра к вашей переменной messageState может быть нетривиальным.

...