Атмосфера Запрос Scoped Трансляции - PullRequest
1 голос
/ 26 июля 2011

У меня проблемы с ограничением объема моих трансляций с использованием 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.

Спасибо

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Оказывается, после многих копаний, кеширование вещателей небезопасно, так как 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);
    }
}

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

0 голосов
/ 07 сентября 2011

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

...