Трансляция атмосферы Джерси не доставляется

Я новичок в Atmosphere, поэтому я должен упустить что-то простое. Я сделал образец и могу заставить работать @Broadcast, но не BroadcasterFactory. Я могу отследить попадание onMessage (через прослушиватель), но я не вижу, чтобы onBroadcast происходило, если не указан @Broadcast. Кроме того, если я не укажу @Broadcast, я не увижу сообщение, доставленное клиенту. Мой код WebSocket очень прост:

@Path("/chat")
@AtmosphereService(
        interceptors = {AtmosphereResourceLifecycleInterceptor.class, 
                        TrackMessageSizeInterceptor.class/*,
                        BroadcastOnPostAtmosphereInterceptor.class*/}//,
        )
public class HelloWorldWS {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public SuspendResponse<String> connect(@Context AtmosphereResource res) 
    {
        // eventually this will be done via subscription in the post area
        BroadcasterFactory.getDefault().get().addAtmosphereResource(res);

        return new SuspendResponse.SuspendResponseBuilder<String>()
                //.broadcaster(BroadcasterFactory.getDefault().get())
                .outputComments(true)
                .addListener(new ResourceListener())
                .build();
    }

    //@Broadcast(writeEntity = false)
    @POST
    public void broadcast(String message) {
        final String msg = String.format("{'author':'fdsa','message':'%s'}", "Override proof");
        // Send to all
        BroadcasterFactory.getDefault().get().broadcast(msg);
        // No Really, send to all
        Collection<Broadcaster> broadcasters = BroadcasterFactory.getDefault().lookupAll();
        for (Broadcaster b : broadcasters)
        {
            System.out.println("Broadcaster: " + b.toString() + "; Count: " + b.getAtmosphereResources().size());
            for (AtmosphereResource r : b.getAtmosphereResources())
            {
                System.out.println("Notifying Resource: " + r.toString());
                r.write(msg);
            }
        }
    }
}

Когда я включаю @Broadcast/BroadcastOnPostAtmosphereInterceptor, сообщение передается клиенту (тогда мой код в функции «broadcast» ничего не делает). Когда я комментирую @Broadcast/BroadcastOnPostAtmosphereInterceptor, я ожидаю, что мой широковещательный код доставит сообщение.

С @Broadcast я показываю следующие обратные вызовы ResourceListener: onPreSuspend, onSuspend, onConnect, onMessage, onBroadcast (клиент получает это)

Когда @Broadcast закомментирован, я показываю следующие обратные вызовы ResourceListener: onPreSuspend, onSuspend, onConnect, onMessage (клиент никогда не получает сообщения)

Что я делаю неправильно?

Я использую атмосферу 2.1.2 с Джерси 1.17.


person BabelFish    schedule 09.04.2014    source источник


Ответы (1)


Избавьтесь от AtmosphereResourceLifecycleInterceptor, если вы используете API SuspendResponse, поскольку он может конфликтовать.

person jfarcand    schedule 09.04.2014
comment
Похоже, это не ссылка на ответ, mustaccio, а ссылка на внешний форум. Что, конечно, еще хуже для SO. - person Tetsujin no Oni; 06.05.2014