我用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客户端何时响应。