14

在我们开发自定义解决方案之前,我正在寻找某种库,它提供:

HTTP 请求的非阻塞队列

具有以下属性:

  • 在以下情况下持续请求以避免丢失:
    • 网络连接中断
    • 应用程序退出,后台应用程序强制GC
    • ETC..
  • 推出所有这些领域的可能性:
    • 地址
    • 标头
    • 发布数据

那么请问,有什么有用的知道吗,有什么可以节省我们一整天的时间来开发这个?

现在我们不需要对完成的请求进行任何回调,也不需要保存结果数据,因为不会有这样的。

4

4 回答 4

6

在我看来,一个好的和直接的解决方案是使用复杂的连接处理框架(例如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。

  • 它为您提供了一种将应用程序构建为参与者层次结构的清晰方法:
    • Actors 通过消息传递进行通信,使用不可变消息,因此您不必关心线程安全
    • Actors 消息存储在消息框中,可以持久
    • 演员有责任监督他们的孩子
    • Actor 可以在一个或多个 JVM 上运行,并且可以使用多种协议进行通信
  • 它为异步处理提供了一个轻量级的抽象Future,它比 Java Futures 更容易使用。
  • 它提供了其他花哨的东西,例如事件总线、ZeroMQ 适配器、远程支持、数据流并发、调度程序

一旦你熟悉了这两个框架,你就会发现你需要的东西可以很容易地通过它们进行编码。

实际上,您需要的是一个用 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)

于 2012-08-08T11:15:49.177 回答
2

是一个开源库的链接,该库是布拉格捷克技术大学一名学生的硕士论文。它是一个非常大且功能强大的库,主要关注位置。不过,它的好处是它省略了 REST 所具有的标头和其他内容。

这是最新的分支,希望它至少能给你“自己的”解决方案的灵感。

于 2012-08-06T20:12:30.370 回答
1

那些并发集合怎么样:

http://mcg.cs.tau.ac.il/projects/concurrent-data-structures

我希望许可证没问题。

于 2012-08-05T23:08:39.117 回答
1

你会想看看这些帖子。(在文件末尾添加)

基本上,一种对我来说非常有效的方法是将请求与队列和执行程序分开。请求作为 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/

更新:

您可以为那些无法执行的请求创建另一个队列。我想到的一种方法是将所有失败的请求添加到重试队列中。当手机仍然认为有任何类型的互联网连接可用时,重试队列将尝试重新运行这些任务。在请求对象中,您可以设置最大重试次数,并将其与每次重试时增加的 currentRetry 数进行比较。嗯,这可能很有趣。我肯定会考虑将其包含在我的图书馆中。

于 2012-08-06T20:43:08.940 回答