我用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以在数组中保存响应。
非常感谢
答案 0 :(得分:1)
REST通过HTTP工作,HTTP是一种通信的请求/响应模型。这意味着您需要发送请求才能获得响应。 Web套接字是一种全双工套接字模型。这意味着只要连接已启动,客户端或服务器就可以发送消息。您面临的挑战是如何在没有请求的情况下尝试使用REST发送响应。您可以从Web套接字排队响应,然后使用下一个REST响应将其发回。但是,这将要求REST客户端定期轮询服务器,因为您无法指示Web Socket客户端何时响应。