Atmosphere + Jersey:我如何拥有多个广播公司?

问题描述 投票:0回答:2

我有一个正在运行的 Jersey/Atmosphere/Guice 应用程序,其中有两个 Atmosphere 资源。第一个几乎是示例聊天应用程序的克隆:

@Path("/chat")
@AtmosphereService(broadcaster = JerseyBroadcaster.class, path = "/chat")
public class ChatResource {

    @Suspend(contentType = "application/json")
    @GET
    public String suspend() {
       return "";
    } 

    @Broadcast(writeEntity = false)
    @POST
    @Produces("application/json")
    public Response broadcast(Message message) {
        return new Response(message.author, message.message);
    }
}

第二个是测试通知资源,将发送服务器端事件:

@Path("/notifications")
@AtmosphereService(broadcaster = JerseyBroadcaster.class, path = "/notifications")
public class NotificationsResource {

    @Suspend(contentType = "application/json")
    @GET
    public String suspend() {
       return "";
    } 
}

一切都已正确接线并且工作正常。但是,为了让我发送服务器端事件,我发出:

MetaBroadcaster.getDefault().broadcastTo("/*", new Response(...));

显然,这会将广播消息发送到两个资源。我想要做的是将服务器端事件仅发送到通知资源:

MetaBroadcaster.getDefault().broadcastTo("/notifications", new NotificationResponse(...));

但是,这行不通。我总是收到以下错误:

org.atmosphere.cpr.MetaBroadcaster - No Broadcaster matches /notifications.

那是因为只有一家广播公司注册; /* 上的 JerseyBroadcaster。

问题是:如何使这两个资源拥有具有不同 ID/名称的不同广播者?

java jersey guice atmosphere
2个回答
7
投票

在资源中,暂停使用您想要的通道(如果通道不存在,lookup() 的“true”参数将强制创建该通道):

@Suspend( contentType = MediaType.APPLICATION_JSON, period = MAX_SUSPEND_MSEC )
@GET
public Broadcastable suspend( @Context final BroadcasterFactory factory )
{
    return new Broadcastable( factory.lookup( MY_CHANNEL, true ) );
}

在几乎可以在任何地方的其他代码中,广播到该频道:

Broadcaster broadcaster = BroadcasterFactory.getDefault().lookup( MY_CHANNEL );
if( broadcaster != null ) {
    broadcaster.broadcast( message );
}

如果您要从资源方法进行广播,则可以对其进行注释(如 ChatResource 的 Broadcast() 方法所示)。


3
投票

只需使用@PathParam注释注入Broadcaster即可:

private
@PathParam("topic")
Broadcaster topic;

您还可以使用@Context注释。

© www.soinside.com 2019 - 2024. All rights reserved.