我可以在 RESTful Web 服务中使用 wait() 吗?



我有一个 RESTful Web 服务,用于 NetBeans 上的服务器。此 Web 服务应从客户端(多人游戏(收到许多请求。

我仍然不熟悉这个主题,但如果我理解正确 - 从客户端到我的 Web 服务的每次调用都是线程安全的 - 因为与 Web 服务的每个连接都在不同的线程上(我的所有变量都在 Web 服务方法中(这是真的吗?

这就引出了我的问题:我可以在 Web 服务方法中使用wait();吗?假设我正在等待两个客户端连接,因此第二个连接将使用notifyAll();但是由于Web服务不是真正的线程,我不知道是否可以在那里使用这些方法?我应该改用什么??

这是我的网络服务:

@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();
} } }`

您始终可以使用 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;
        }
    }
}

是的。方法中的所有局部变量都是线程安全的。类字段变量可能是线程安全的,也可能不是。这取决于你。如果 rest 控制器具有单例作用域(通常默认情况下有(,则意味着类字段在所有请求之间共享。

因此,从技术上讲,您可以使用一些共享锁对象来同步它。尝试这样做。但最好在异步模式下进行。请参阅本文中的具有长轮询的反向 Ajax 彗星技术。

或者,您可以将反向 Ajax 与 Websocket 一起使用,并将"传输已收到"发送回客户端,而不会有任何空闲。

相关内容

  • 没有找到相关文章

最新更新