泽西jax-rs资源之间的沟通

时间:2015-01-05 01:35:17

标签: java rest jersey jax-rs jersey-2.0

我想在泽西岛实施长期投票。我有一个用于发送消息的资源(messages.send)和另一个用于长轮询的消息(messages.longpoll)。我在messages.longpoll中暂停异步请求,但无法实现如何通知新消息被添加,因为这发生在另一个资源中 - messages.send。

1 个答案:

答案 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)发布消息。然后将该消息广播给所有连接的客户端。