jersey jax-rs资源间通信
jersey jax-rs communication between resources
我想在 Jersey 实现长轮询。我有一个用于发送消息的资源 (messages.send) 和另一个用于长轮询的资源 (messages.longpoll)。我在 messages.longpoll 中暂停异步请求,但无法意识到如何通知它添加了新消息,因为这发生在另一个资源中 - messages.send.
如果您不受 HTML5 之前技术的束缚,那么您可以尝试使用 SSE 完成您的任务(服务器发送的事件,请参阅 Wiki). Jersey has a support for SSE, take a look at the dedicated chapter: 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 方法 post 消息(HTTP POST
调用 messages
)。然后将消息广播到所有连接的客户端。
我想在 Jersey 实现长轮询。我有一个用于发送消息的资源 (messages.send) 和另一个用于长轮询的资源 (messages.longpoll)。我在 messages.longpoll 中暂停异步请求,但无法意识到如何通知它添加了新消息,因为这发生在另一个资源中 - messages.send.
如果您不受 HTML5 之前技术的束缚,那么您可以尝试使用 SSE 完成您的任务(服务器发送的事件,请参阅 Wiki). Jersey has a support for SSE, take a look at the dedicated chapter: 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 方法 post 消息(HTTP POST
调用 messages
)。然后将消息广播到所有连接的客户端。