具有持久性的HTTP POST请求的非阻塞队列

时间:2012-07-20 08:35:16

标签: java android asynchronous message-queue

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

HTTP请求的非阻塞队列

具有以下属性:

  • 如果出现以下情况,坚持要求避免损失:
    • 网络连接中断
    • 应用程序退出,在后台应用程序上强制GC
    • 等。
  • 推出所有这些领域的可能性:
    • 地址
    • 接头
    • POST数据

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

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

4 个答案:

答案 0 :(得分:5)

在我看来,一个好的,直接的解决方案是使用复杂的连接处理框架来开发自己的层(不应该这么复杂),例如 Netty {{3与用于异步处理的复杂框架一起,例如 Akka https://netty.io/

让我们首先在http://akka.io/内查看 Netty 对http的支持:

4.3。 HTTP实施

HTTP绝对是互联网上最受欢迎的协议。已经有许多HTTP实现,例如Servlet容器。那么为什么Netty在其核心上拥有HTTP?

Netty的HTTP支持与现有的HTTP库非常不同。它使您可以完全控制HTTP消息在低级别的交换方式。因为它基本上是HTTP编解码器和HTTP消息类的组合,所以没有限制,例如强制线程模型。也就是说,您可以编写自己的HTTP客户端或服务器,它们可以按照您想要的方式工作。您可以完全控制HTTP规范中的所有内容,包括线程模型,连接生命周期和分块编码。

现在让我们深入挖掘 Akka 。 Akka是一个框架,它在Java并发API的顶部提供了一个很好的抽象,它带有Java或Scala中的API。

  • 它为您提供了一种清晰的方法来将您的应用程序构建为 actor 的层次结构:
    • 演员通过消息传递进行通信,使用不可变消息,这样您就不必关心线程安全
    • Actors消息存储在消息框中,可以是持久的
    • 演员负责监督他们的孩子
    • 演员可以在一个或多个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)

答案 1 :(得分:2)

Here是开源图书馆的链接,是布拉格捷克技术大学学生的硕士论文。它是一个非常庞大和强大的图书馆,主要关注位置。不过,关于它的好处是它省略了REST所具有的标题和其他东西。

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

答案 2 :(得分:1)

那些并发集合如何:

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

我希望许可证还可以。

答案 3 :(得分: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/

更新

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