Подтвердить что ты не робот

Неблокирующая очередь запросов HTTP POST с сохранением

Прежде чем мы разработаем наше собственное решение, я ищу какую-то библиотеку, которая обеспечивает:

Неблокирующая очередь HTTP-запросов

с этими атрибутами:

  • Сохраняющиеся запросы, чтобы избежать его потери в случае:
    • прерывание сетевого подключения
    • приложение quit, принудительное использование GC в фоновом приложении
    • и т.д..
  • Возможность выставить все эти поля:
    • Адрес
    • Заголовки
    • Данные POST

Так что, пожалуйста, есть ли что-нибудь полезное, знаете ли, что может спасти нас целый день от этого?

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

4b9b3361

Ответ 1

По моему скромному мнению, хорошим и простым решением было бы разработать свой собственный слой (который не должен быть настолько сложным), используя сложную структуру для обработки соединений, такую ​​как Netty https://netty.io/ вместе со сложной структурой для асинхронной обработки, например Akka http://akka.io/

Сначала загляните внутрь Netty для http на http://static.netty.io/3.5/guide/#architecture.8:

4,3. Выполнение HTTP

HTTP - это, безусловно, самый популярный протокол в Интернете. Уже существует ряд реализаций HTTP, таких как контейнер Servlet. Тогда почему Netty имеет HTTP поверх своего ядра?

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

А теперь отпустите внутри Akka. Akka - это основа, которая обеспечивает превосходную абстракцию в верхней части Java-совместимого API, и поставляется с API на Java или Scala.

  • Он предоставляет вам четкий способ структурировать ваше приложение как иерархию участников:
    • Актеры обмениваются сообщениями, используя неизменяемое сообщение, чтобы вы не заботились о безопасности потоков
    • Сообщения участников хранятся в ящиках сообщений, которые могут быть долговечными
    • Актеры отвечают за надзор за своими детьми.
    • Актеры могут запускаться на одной или нескольких JVM и могут взаимодействовать с использованием большого количества протоколов.
  • Он обеспечивает легкую абстракцию для асинхронной обработки, Будущее, которое проще использовать тогда Java Futures.
  • Он предоставляет другие интересные вещи, такие как Event Bus, адаптер ZeroMQ, поддержка Remoting, Dataflow concurrency, планировщик

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

Фактически, вам нужен HTTP-прокси, закодированный в Netty, который после получения запроса немедленно отправляет сообщение Акку Акка типа FSM (http://doc.akka.io/docs/akka/2.0.2/java/fsm.html), который использует долговечный почтовый ящик (http://doc.akka.io/docs/akka/2.0.2/modules/durable-mailbox.html)

Ответ 2

Здесь - ссылка на библиотеку с открытым исходным кодом, которая была магистерской диссертацией в Чешском техническом университете в Праге. Это очень большая и мощная библиотека и в основном фокусируется на местоположении. Хорошая вещь об этом, однако, заключается в том, что она опускала заголовки и другие, - что у REST есть.

Это последняя версия, и, надеюсь, это даст вам хотя бы вдохновение для "собственного" решения.

Ответ 4

Вы хотите посмотреть на них на сообщения. (добавлено в конце документа)

В основном подход, который работает для меня, - это отделить запросы от очереди и исполнителя. Запросы выполняются как Runnables или Callables. Наследовать от них, чтобы создавать разные запросы к вашему API или сервису. Установите их там, добавляя заголовки и или тело до их выполнения.

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

Я останусь настроенным. Если вам нужна дополнительная глубина, я могу опубликовать некоторые конкретные фрагменты кода. Там источник основного примера в первой ссылке, хотя.

http://ugiagonzalez.com/2012/08/03/using-runnables-queues-and-executors-to-perform-tasks-in-background-threads-in-android/

http://ugiagonzalez.com/2012/07/02/theres-life-after-asynctasks-in-android/

Update:

Вы можете создать очередную очередь для тех запросов, которые невозможно выполнить. Один из подходов, который приходит мне на ум, заключается в том, чтобы добавить все неудавшиеся запросы в очередь повторов. В очереди повторных попыток повторите запуск этих задач, пока телефон по-прежнему считает, что существует какое-либо доступное интернет-соединение. В объекте запроса вы можете установить максимальное количество повторных попыток и сравнить его с номером currentRetry, увеличивающим его при каждом повторном просмотре. Ммм, это может быть интересно. Я обязательно подумаю о том, чтобы включить это в мою библиотеку.