在我们开发自定义解决方案之前,我正在寻找某种库,它提供:
HTTP 请求的非阻塞队列
具有以下属性:
- 在以下情况下持续请求以避免丢失:
- 网络连接中断
- 应用程序退出,后台应用程序强制GC
- ETC..
- 推出所有这些领域的可能性:
- 地址
- 标头
- 发布数据
那么请问,有什么有用的知道吗,有什么可以节省我们一整天的时间来开发这个?
现在我们不需要对完成的请求进行任何回调,也不需要保存结果数据,因为不会有这样的。
在我们开发自定义解决方案之前,我正在寻找某种库,它提供:
HTTP 请求的非阻塞队列
具有以下属性:
那么请问,有什么有用的知道吗,有什么可以节省我们一整天的时间来开发这个?
现在我们不需要对完成的请求进行任何回调,也不需要保存结果数据,因为不会有这样的。
在我看来,一个好的和直接的解决方案是使用复杂的连接处理框架(例如Netty https://netty.io/ )开发自己的层(不应该那么复杂) ,以及复杂的异步处理框架,如Akka http://akka.io/
让我们首先在http://static.netty.io/3.5/guide/#architecture.8了解Netty对 http 的支持:
4.3. HTTP 实现
HTTP 绝对是 Internet 中最流行的协议。已经有许多 HTTP 实现,例如 Servlet 容器。那么为什么 Netty 在其核心之上有 HTTP 呢?
Netty 的 HTTP 支持与现有的 HTTP 库有很大不同。它使您可以完全控制在低级别交换 HTTP 消息的方式。因为它基本上是 HTTP 编解码器和 HTTP 消息类的组合,所以没有强制线程模型等限制。也就是说,您可以编写自己的 HTTP 客户端或服务器,完全按照您想要的方式工作。您可以完全控制 HTTP 规范中的所有内容,包括线程模型、连接生命周期和分块编码。
现在让我们深入了解 Akka。Akka 是一个在 Java 并发 API 之上提供出色抽象的框架,它带有 Java 或 Scala 中的 API。
一旦你熟悉了这两个框架,你就会发现你需要的东西可以很容易地通过它们进行编码。
实际上,您需要的是一个用 Netty 编码的 http 代理,它在收到请求后立即向FSM类型的Akka Actor发送消息(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)
这是一个开源库的链接,该库是布拉格捷克技术大学一名学生的硕士论文。它是一个非常大且功能强大的库,主要关注位置。不过,它的好处是它省略了 REST 所具有的标头和其他内容。
这是最新的分支,希望它至少能给你“自己的”解决方案的灵感。
你会想看看这些帖子。(在文件末尾添加)
基本上,一种对我来说非常有效的方法是将请求与队列和执行程序分开。请求作为 Runnables 或 Callables 执行。从它们继承以创建对您的 API 或服务的不同类型的请求。在执行它们之前将它们设置在那里添加标题和/或正文。
将这些请求排入队列中(选择更适合您的 - 我会说LinkedBlockingQueue将完成这项工作)从绑定服务中链接到执行程序,并从您的活动或任何其他范围调用它们。如果您不需要获取响应和回调,您可以避免使用 Guava 来监听期货或创建自己的回调。
我会继续关注。如果您需要更多深度,我可以发布一些特定的代码。不过,第一个链接中有一个基本示例的来源。
http://ugiagonzalez.com/2012/07/02/theres-life-after-asynctasks-in-android/
更新:
您可以为那些无法执行的请求创建另一个队列。我想到的一种方法是将所有失败的请求添加到重试队列中。当手机仍然认为有任何类型的互联网连接可用时,重试队列将尝试重新运行这些任务。在请求对象中,您可以设置最大重试次数,并将其与每次重试时增加的 currentRetry 数进行比较。嗯,这可能很有趣。我肯定会考虑将其包含在我的图书馆中。