2017-02-09 11 views
0

У меня есть веб-сервис RESTful, который я использую для сервера на NetBeans. Этот веб-сервис должен получать множество запросов от клиентов (многопользовательская игра).Можно ли использовать wait() в веб-сервисе RESTful?

Я все еще новичок в этой теме, но если я правильно понимаю, каждый звонок от клиентов к моему вебсервису является потокобезопасным - потому что каждое подключение к веб-службе находится в другом потоке (все мои переменные находятся внутри методы webservice), это правда?

И это подводит меня к моему вопросу: Могу ли я использовать wait(); внутри метода webservice? допустим, я жду двух клиентских подключений, поэтому второе соединение будет использовать notifyAll(); Но поскольку веб-сервис не является потоком, я не знаю, можно ли использовать эти методы там? Что я должен использовать вместо этого?

Это мой вебсервис:

@Path("/w") 
public class JSONRESTService { 
    String returned; 

    @POST 
    @Consumes("application/json") 
    @Path("/JSONService") 
    public String JSONREST(InputStream incomingData) { 
     StringBuilder JSONBuilder = new StringBuilder(); 
     try { 
      BufferedReader in = new BufferedReader(new InputStreamReader(incomingData)); 
      String line = null; 
      while ((line = in.readLine()) != null) { 
       JSONBuilder.append(line); 
      } 

      returned = "transfer was completed"; 

      // This is what I'm trying to add but I know that I can't: 

      // count is a static variable, every new connection will increase this value  

      // only one player is connected 
      if (Utility.count == 1)  
       wait(); //wait for a 2nd player to connect to this webservice 

      // 2nd player is connected to this webservice 
      if (Utility.count == 2) 
       notifyAll();   // notify the 1st player 

     } catch (Exception e) { 
      System.out.println ("Error Parsing: - "); 
      returned ="error"; 
     } 
     System.out.println ("Data Received: " + JSONBuilder.toString()); 
     return (returned); 
    } 
} 

Клиент:

JSONObject jsonObject = new JSONObject("string"); 

// Step2: Now pass JSON File Data to REST Service 
try { 
    URL url = new URL("http://localhost:8080/w/JSONService"); 
    URLConnection connection = url.openConnection(); 
    connection.setDoOutput(true); 
    connection.setRequestProperty("Content-Type", "application/json"); 
    connection.setConnectTimeout(5000); 
    connection.setReadTimeout(5000); 
    OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); 
    out.write(jsonObject.toString()); 
    out.close(); 

    //string answer from server: 
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
    StringBuffer sb = new StringBuffer(""); 
     String line=""; 
     while ((line = in.readLine()) != null) { 
      sb.append(line); 
      System.out.println("\n"+line); 
    in.close(); 
} catch (Exception e) { 
    System.out.println("\nError while calling JSON REST Service"); 
    System.out.println(e); 
} 

br.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
} } }` 
+0

Перед многопоточности. 'if (Utility.count = 1)' должен быть 'if (Utility.count == 1)', первый присваивает 1 для подсчета. Второй момент, второй 'if' должен быть' else if' –

+0

Спасибо! Да, я написал это как идею, моя проблема - wait() и notify() в webservice – SHAI

+0

Забудьте о коде, чего вы хотите достичь конкретно? –

ответ

1

Вы всегда можете использовать wait() и notify(), так как он влияет на поток, в котором работает код. Независимо от того, используете ли вы его, зависит от ситуации.

Если вы хотите очередь игроков затем использовать очереди :)

Небольшой пример я постучал ...

@Path("/w") 
public class JSONRESTService { 

    private static BlockingQueue<Player> queue = new ArrayBlockingQueue<>(999); 

    @POST 
    @Consumes("application/json") 
    @Path("/JSONService") 
    public String JSONREST(InputStream incomingData) {  


     Player thisPlayer = ...; // Get player from session or something 

     System.out.println (thisPlayer.getName() + " starting..."); 

     try { 

      if (queue.isEmpty()) { 
       System.out.println ("waiting for an opponent"); 
       queue.add(thisPlayer); 
       synchronized (thisPlayer) { 
        thisPlayer.wait(); 
       } 
      } else { 
       System.out.println ("get next in queue"); 
       Player opponent = queue.take(); 
       opponent.setOpponent(thisPlayer); 
       thisPlayer.setOpponent(opponent); 
       synchronized (opponent) { 
        opponent.notify(); 
       } 
      } 

      System.out.println (thisPlayer.getName() + " playing " + thisPlayer.getOpponent().getName()); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    static class Player { 

     private String name; 
     private Player opponent; 

     Player (String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

     public Player getOpponent() { 
      return opponent; 
     } 

     public void setOpponent(Player opponent) { 
      this.opponent = opponent; 
     } 
    } 
} 
+0

Привет, большое спасибо за ваш комментарий! Я попытался это сделать, проблема в том, что соединение потеряно после ожидания() ... Мой клиент (1-й игрок) подключается к серверу, сервер «wait» («) (что делает мой клиент удалять соединение (« поймать").Второй Клиент будет уведомлять() - как в вашем коде, что сделает - 1-й игрок продолжит работу на сервере, - но клиентская сторона не знает об этом, поскольку соединение было потеряно из-за wait(); – SHAI

+0

Я добавил моего основного клиента – SHAI

+0

Не удивительно, так как вы установили свой тайм-аут на 5 секунд :) Можете ли вы просто увеличить время ожидания? Если нет, и вы хотите придерживаться такого подхода, вам нужно будет использовать опрос - например. продолжайте запрашивать противника, пока он не станет доступен. – TedTrippin

1

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

Итак, технически вы можете использовать некоторый объект общей блокировки для синхронизации на нем. Попытайтесь это сделать. Но лучше сделать это в асинхронном режиме. См. Обратную технику Ajax Comet с длинным опросом в статье this.

В качестве альтернативы вы можете использовать Reverse Ajax with Websockets и отправить «Перевод был получен» обратно клиенту без простоя.

+0

Спасибо, я все еще пытаюсь понять это. Мне нужно будет использовать webservice, потому что это проект для школы – SHAI

 Смежные вопросы

  • Нет связанных вопросов^_^