Может ли Grizzly сделать push-сервер, пока поддерживается соединение с клиентом?

Я разрабатываю агент, который соединяет клиента с платформой (сервером). агент основан на гризли-каркасе. Мой агент получает запрос от моего клиента, чтобы зарегистрировать его на платформе. Так что мой агент выполнит эту операцию. Затем мой агент будет ждать операций, поступающих с платформы, и уведомит клиента об этих операциях. Таким образом, связь между моим агентом и клиентом будет сохранена. Если с платформы поступит новая операция, я отправлю запрос на сервер клиенту, поскольку мой клиент остается подключенным ко мне. Я не хочу, чтобы клиент отправлял запросы на новые операции, поступающие с платформы (опрос). Я хочу, чтобы мой агент отправил операцию (POST-запрос) моему клиенту. Я знаю, что это проталкивание сервера отличается от модели "клиент-сервер", но я слышал, что это возможно с помощью гризли.

до сих пор я нашел что-то полезное для реализации этой идеи в Java . Эта ссылка https://grizzly.java.net/spdy.html от grizzly описывает push-запрос сервера, но этот push-запрос сервера не применим для моего случая, так как push-сервер выполняется, когда http-запрос приходит от клиента.

Можно ли реализовать эту идею с помощью гризли?

если да, то как это сделать?

Edit1: я заметил еще одну проблему при использовании http-сервера grizzly-framework. В моем случае мой агент состоит из двух сторон: серверной стороны, которая получает запросы от клиента, и клиентской стороны, которая подключается к платформе. Мой агент получит запрос от клиента. Агент на основе гризли запустит http-обработчик (мой клиентский агент), который анализирует этот запрос. После анализа запроса этот обработчик подключится к платформе. После завершения операции он отправит клиенту http/1.1 200 OK. Если тот же клиент решил отправить мне новую операцию на платформе, я должен установить новое соединение с платформой, что означает для меня создание нового агента на стороне клиента (http-обработчик) для того же клиента. Я имею в виду, что у меня нет доступа к старому экземпляру (старому клиентскому агенту), и я обязан создать новый экземпляр, что подразумевает большой трафик, который мне нужен, чтобы его избежать.В этой ситуации, если обработчик выполняет свою неблокирующую операцию, этот обработчик теряется, поэтому я не могу получить к нему доступ, что означает, что я не могу получить операции с платформы и выполнить серверный запрос. Если я приостановлю обработчик на некоторое время, все поступающие запросы от других клиентов будут заблокированы, поэтому клиенты не смогут обслуживаться.

1 ответ

Решение

IMO SPDY или HTTP/2 плохо вписываются в то, что вам нужно, потому что, как вы справедливо заметили, отправляемый им толчок всегда должен быть связан с первоначальным запросом клиент-сервер. Я бы посоветовал взглянуть на WebSocket [1], [2].

[1] https://grizzly.java.net/websockets.html[2] https://tyrus.java.net/

Другие вопросы по тегам