我想在泽西岛实施长期投票。我有一个用于发送消息的资源(messages.send)和另一个用于长轮询的消息(messages.longpoll)。我在messages.longpoll中暂停异步请求,但无法实现如何通知新消息被添加,因为这发生在另一个资源中 - messages.send。
答案 0 :(得分:0)
如果您不依赖于HTML5之前的技术,那么您可以尝试使用SSE完成任务(服务器发送事件,请参阅Wiki)。泽西岛支持SSE,请看专用章节:Server-Sent Events (SSE) Support。还有一些例子:
然后您的资源可能如下所示:
@Path(“messages”)
@Produces(APPLICATION_JSON)
public class MessageBoardResource {
private static SseBroadcaster broadcaster = new SseBroadcaster();
@GET @Path(“stream”)
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput connect() {
EventOutput eventOutput = new EventOutput();
broadcaster.add(eventOutput);
return eventOutput;
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postMessage(Message message) {
OutboundEvent event = new OutboundEvent.Builder()
.id(getNextId())
.mediaType(MediaType.APPLICATION_JSON_TYPE)
.data(Message.class, message)
.build();
broadcaster.broadcast(event); // invokes eventOutput.write(event);
return Response.ok().build();
}
}
客户端,想要收听未来的消息,然后通过MessageBoardResource #connect方法(HTTP GET
调用messages/stream
)进行连接。其他客户端可以通过MessageBoardResource#postMessage方法(HTTP POST
调用messages
)发布消息。然后将该消息广播给所有连接的客户端。