Трансляции с заданной областью запроса атмосферы

У меня возникли проблемы с ограничением объема моих трансляций при использовании Atmosphere 0.7.2.

У меня есть POJO из Джерси с методом open, и я хочу передать вещательную компанию классу, не относящемуся к веб-сервису. Это позволяет разделить уровни WAR и EJB.

@Path("/")
public class MyJerseyPojo {
    @Context
    private Broadcaster broadcaster;

    @GET
    @Suspend
    public String open() {
        Manager.register(/* Session ID */, new NonWebservice(this.broadcaster));
        return "";
    }
}

public class NonWebService implements Sender {
    private Broadcaster broadcaster;

    public NonWebService(Broadcaster b) {
        this.broadcaster = b;
    }

    @Override
    public void send(String thing) {
        this.broadcaster.broadcast(thing);
    }
}

Идея состоит в том, что события обновления будут вызывать send, и это уведомит клиента о приостановленном ответе. Каждый клиент должен быть связан с отдельным вещателем.

Проблема в том, что это решение использует один и тот же вещатель для всех клиентов. Я попытался добавить @Suspend(scope = Suspend.SCOPE.REQUEST) к методу open, но это приводит к тому, что широковещательные сообщения не принимаются.

Я также попробовал следующее в методе open:

@GET
@Suspend
public String open() {
    Broadcaster b = BroadcasterFactory.getDefault().get(JerseyBroadcaster.class, UUID.randomUUID());
    b.setScope(Broadcaster.SCOPE.REQUEST);
    Manager.register(/* Session ID */, new NonWebservice(b));
}

Это не сработало ни с использованием @Suspend, ни с @Suspend(scope = Suspend.SCOPE.REQUEST). В каждом случае клиент не получал широковещательных сообщений. Однажды я получил сообщение о том, что вещатель уничтожен и не может быть использован, но я не могу вспомнить, как я это сделал!

Я видел похожий вопрос, но не знаю, как перевести его на свой POJO, так как я не расширяю AtmosphereHandler.

Спасибо


person Alan Raison    schedule 26.07.2011    source источник


Ответы (2)


После долгих копаний выяснилось, что кэшировать вещателей небезопасно, так как AtmosphereFilter создавал новый вещатель с областью запроса после завершения моего метода open().

Следовательно, в классе NonWebservice теперь это выглядит так:

public class NonWebService implements Sender {
    private Class<? extends Broadcaster> clazz;
    private Object broadcasterId;

    public NonWebService(Class<? extends Broadcaster> clazz, Object broadcasterId) {
        this.clazz = clazz;
        this.broadcasterId = broadcasterId;
    }

    @Override
    public void send(String thing) {
        Broadcaster b = BroadcasterLookup.getDefault().get(this.clazz, this.broadcasterId);
        b.broadcast(thing);
    }
}

Теперь я мог бы выяснить, как планировать фиксированные широковещательные рассылки в области запроса...

person Alan Raison    schedule 27.07.2011

На самом деле, в конце концов я обнаружил, что мне нужно вернуть широковещательный объект из моего приостановленного метода. Вещатель был воссоздан в рамках сеанса, но оставался доступным для последующих трансляций. Просто убедитесь, что вы ничего не транслируете, пока приостановленный метод не вернется, так как он может быть потерян.

person Alan Raison    schedule 07.09.2011