Атмосфера / Джерси двунаправленный разговор

Я видел много примеров Атмосферы, включая pub-sub. Я хочу сделать что-то вроде pub-sub (клиент подписывается на канал, который является уникальным для этого клиента; сервер периодически публикует этот канал), за исключением того, что клиент также отправляет данные на сервер. Клиент отправляет данные в ответ на данные, отправленные сервером, и в других случаях, когда на клиенте происходит что-то важное, о чем сервер должен знать (о чем сервер не должен подтверждать).

Возможно ли вообще сделать это с Атмосферой?

Это может выглядеть примерно так:

@Stateless
@Path("/id/{clientId}/key/{clientKey}")
public class MyService {
    @POST
    @Produces("application/xml")
    @Consumes("application/xml")
    @Suspend
    public StreamingOutput subscribe(@PathParam("clientId") String clientId,
                                     @PathParam("clientKey") String clientKey,
                                     @Context Broadcaster broadcaster,
                                     InputStream body) {
        if (!authenticate(clientId, clientKey) {
            throw new WebApplicationException(401);
        }
        broadcaster.setID(clientId);

        // Do something here... Not sure what
    }
}

Но здесь есть пара проблем:

Входящее соединение будет приостановлено, поэтому оно не сможет ничего посылать на сервер, кроме как при возобновлении через широковещательную рассылку;Любое использованиеInputStream приведет к блокировке ввода / вывода, что побеждает цель использования атмосферы.

Обе эти проблемы можно решить, просто удалив@Suspend, но тогда я нахожусь в ситуации потока на соединение.

У меня такое ощущение, что Атмосфера здесь не будет подходящей технологией, и, возможно, мне придется сделать что-то немного более низкого уровня. Но я не уверен, как это сделать. Идеи?

Редактировать:

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

Ответы на вопрос(1)

Ваш ответ на вопрос