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