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)。然后将消息广播到所有连接的客户端。