Атмосфера / Джерси двунаправленный разговор
Я видел много примеров Атмосферы, включая 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, поэтому все это выглядит не так, как то, что можно сделать асинхронно.