Atmosfera + Jersey: Como tenho várias emissoras?

Eu tenho um aplicativo Jersey / Atmosfera / Guice que tem dois resources de atmosfera. O primeiro é praticamente um clone do aplicativo de bate-papo de exemplo:

@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); } } 

O segundo é um recurso de notificação de teste que será enviado aos events do lado do servidor:

 @Path("/notifications") @AtmosphereService(broadcaster = JerseyBroadcaster.class, path = "/notifications") public class NotificationsResource { @Suspend(contentType = "application/json") @GET public String suspend() { return ""; } } 

Tudo está conectado corretamente e funciona bem. No entanto, para que eu envie um evento do lado do servidor eu emito:

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

Claramente, isso enviará a mensagem de transmissão para os dois resources. O que eu quero fazer é enviar os events do lado do servidor apenas para o recurso de notifications:

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

No entanto, isso não funciona. Eu sempre recebo o seguinte erro:

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

Isso porque há apenas uma emissora registrada; o JerseyBroadcaster em / *.

A questão é: como faço para que esses dois resources tenham difusores diferentes com IDs / Nomes diferentes?

No recurso, suspender usando o canal desejado (o parâmetro ‘true’ para pesquisa () força o canal a ser criado se ele não existir):

 @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 ) ); } 

No outro código, que pode ser praticamente em qualquer lugar, transmitido para esse canal:

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

Se você vai transmitir de um método de resources, você pode anotá-lo (como mostrado no método broadcast () do ChatResource).

Basta injetar o Broadcaster usando a anotação @PathParam:

 private @PathParam("topic") Broadcaster topic; 

Você também pode usar a anotação @Context. Espero que ajuda.

– Jeanfrancois

Intereting Posts