等待REST请求JAVA的响应



我用glassfish创建了一个java项目,并发布了一个简单的REST GET服务,像这样:

@Path("/get") 
public class Rest {
     @Path("test/{user}/")
     @GET
     public String getTest(@PathParam("user") String id) throws IOException {
        //send message to websocket client and wait for response
         //return "websocket client response";
     }
}

this works fine.

我也有一个websocket服务器实现在同一项目。这个实现允许我向连接的客户端发送数据。

这是我的WebSocket实现:
@ServerEndpoint("/websocket")
public class WebSocketServer {

    @OnOpen
    public void onOpen(Session userSession){
        System.out.println("Se conecto un nuevo cliente");
        Modelo.getInstance().users.add(userSession);
    }
    @OnMessage
    public void onMessage(String message,Session userSession) throws IOException{
        String username=(String) userSession.getUserProperties().get("username");
        if(username==null){
            userSession.getUserProperties().put("username", message);
            userSession.getBasicRemote().sendText(Modelo.getInstance().buildJsonData("Servidor","nuevo cliente conectado como: "+message));
        }else{
            Iterator<Session> iterator=Modelo.getInstance().users.iterator();
            while(iterator.hasNext()){
                iterator.next().getBasicRemote().sendText(Modelo.getInstance().buildJsonData(username,message));
            }
        }
    }
    @OnClose
    public void onClose(Session userSession){
        Modelo.getInstance().users.remove(userSession);
    }
    @OnError
    public void onError(Throwable t){
        t.printStackTrace();
    }
}

这个也很好。

当REST方法被调用时,我可以成功地向我的一个websockets客户端发送消息。

事情是我想作为REST响应返回,WebSocket客户端发送给我的数据。

所以…1)在Java Server中接收REST GET请求2)通过websocket发送到我想要获取信息的客户端3)使用websocket客户端发送给我的消息响应REST GET请求。

我怎样才能做到这一点?

(解决)?

我找到了一个方法来做这件事,请,我想知道你的想法。

我找到了这篇关于异步rest响应的文章。

所以我实现了,这是我想到的第一件事,我把websocket客户端消息保存在一个数组中,当数组有消息时,REST请求被响应。

@Path("/resource")
     @GET
     public void asyncGet(@Suspended final AsyncResponse asyncResponse) throws IOException {
         Modelo.getInstance().enviarMensaje("5", "escenas");
         new Thread(new Runnable() {
             @Override
             public void run() {
                 String result = veryExpensiveOperation();
                 asyncResponse.resume(result);
             }
             private String veryExpensiveOperation() {
                while(Modelo.getInstance().responses.size()==0){
                }
                String result=Modelo.getInstance().responses.get(0);
                Modelo.getInstance().responses.clear();
                return result;
                 // ... very expensive operation
             }
         }).start();
     }

我知道还有更多的东西来验证这个响应,但首先它是有效的。

我还编辑了websockerserver.java以在数组中保存响应。

非常感谢

REST工作于HTTP之上,HTTP是一种请求/响应通信模型。这意味着您需要发送请求才能获得响应。Web Sockets是一个全双工套接字模型。这意味着只要连接正常,客户机或服务器就可以发送消息。挑战在于,您试图在没有请求的情况下使用REST发送响应。您可以将web套接字的响应排队,然后将其与下一个REST响应一起发送回来。但是,这需要REST客户端定期轮询服务器,因为您不知道Web Socket客户端何时响应。

相关内容

  • 没有找到相关文章

最新更新