等待REST请求JAVA上的响应

时间:2014-07-14 23:59:54

标签: java rest websocket glassfish

我用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";
     }
}

这很好。

我在同一个项目中也有一个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请求。

我怎样才能做到这一点?

[解决]

我找到了办法,请您知道您的想法。

我发现这篇文章:here关于异步休息响应。

所以我实现了,首先想到的是,我将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以在数组中保存响应。

非常感谢

1 个答案:

答案 0 :(得分:1)

REST通过HTTP工作,HTTP是一种通信的请求/响应模型。这意味着您需要发送请求才能获得响应。 Web套接字是一种全双工套接字模型。这意味着只要连接已启动,客户端或服务器就可以发送消息。您面临的挑战是如何在没有请求的情况下尝试使用REST发送响应。您可以从Web套接字排队响应,然后使用下一个REST响应将其发回。但是,这将要求REST客户端定期轮询服务器,因为您无法指示Web Socket客户端何时响应。