Я видел несколько примеров Атмосферы, включая 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
приведет к блокировке ввода / вывода, что отрицательно сказывается на цели использования Atmosphere.
Обе эти проблемы можно решить, просто удалив @Suspend
, но тогда я нахожусь в ситуации с потоком на соединение.
У меня такое ощущение, что Атмосфера здесь не будет подходящей технологией, и, возможно, мне придется сделать что-то немного более низкого уровня. Но я не уверен, как это сделать. Идеи?
Edit:
Я все равно не могу найти простой способ асинхронного синтаксического анализа XML, так что все это выглядит не так, как то, что можно сделать асинхронно.