回调函数中有回调函数吗

因为是我的书包,所以我喜欢JavaScript 。 实际上,我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此,当我发现自己处于非JavaScript环境中时(例如Java) ,我往往会错过使用回调的机会。

好消息是您可以在Java中模拟异步回调。 实际上,我最近在一个我称为Ahoy的图书馆中做到了这一点! ,这是适用于AWS的Java SQS库的异步SQS适配器 。

对于初学者来说, SQS是一个基于云的消息传递平台 –使用SQS,您可以创建队列并将消息放入这些队列,然后可以稍后或通过其他某个过程或相同的确切过程读取这些消息。 所有这些都利用了Amazon的大规模冗余架构,在面对并发访问时提供了极高的可用性。

Java中的异步回调可以通过两个功能实现:匿名类(包含一个方法)和Java的java.util.concurrent包。

因为Java不允许您轻松地将函数(或方法)作为参数传递,以模拟回调,所以您可以创建一个包含一个基本上模仿函数的方法的接口。 对于Ahoy,有两个接口: MessageSendCallbackMessageReceivedCallback –都有一个方法:分别是onSendonReceive 。 因此,Ahooy!的主要类被称为SQSAdapterSQSAdapter公开了两个简单的方法: sendreceive并且都采用了它们相关的回调接口。

要理解的最直接的回调是receive方法。 可以想象, receive是为了处理从特定队列接收到消息时的行为。 因此, receive方法定义如下:

SQSAdapter的接收方法

public void receive(final MessageReceivedCallback callback) {}

MessageReceivedCallback接口如下所示:

MessageReceivedCallback接口

public interface MessageReceivedCallback {public void onReceive(String messageId, String message);
}

请注意, onReceive方法需要一个消息ID(特定于SQS)和消息本身-在SQS的情况下,它始终是一个String (请记住, String可以容纳您想要的任何内容:JSON,XML,字节序列)等)。

至此,客户淘! 在收到消息时提供消息的预期行为。 此行为可能是将某些内容写入数据库,生成另一条消息,然后将其发送到另一个队列(您命名)。

现在,有趣的部分是Ahoy!的receive方法的实现。 为了实现异步性,我使用了Java的java.util.concurrent包,可悲的是,它似乎不受欢迎。

接收方法的实现与回调被调用

private void receive(final AmazonSQS sqs, final String queueURL, final MessageReceivedCallback callback) {pool.execute(new Runnable() {public void run() {final List<Message> messages = sqs.receiveMessage(new ReceiveMessageRequest(queueURL).withMaxNumberOfMessages(10).withWaitTimeSeconds(20)).getMessages();if (messages.size() > 0) {for (final Message message : messages) {callback.onReceive(message.getMessageId(), message.getBody());sqs.deleteMessage(new DeleteMessageRequest(queueURL, message.getReceiptHandle()));}}}});
}

使用固定的线程池,将创建一个线程,该线程等待消息到达特定队列。 当显示一条消息时,将为每条消息调用传入的MessageReceivedCalledback

有关此示例对Ahoy!客户的工作方式的示例,下面是一个测试用例,用于验证回调的执行:

接收方法已实现

final boolean[] wasReceived = {false};
ahoy.receive(new MessageReceivedCallback() {public void onReceive(String messageId, String message) {wasReceived[0] = true;assertNotNull("message id was null", messageId);assertEquals("message wasn't " + origMessage, origMessage, message);}
});

同样,发送消息是相似的–创建了一个新的Runnable实例,该实例发送特定的消息并调用MessageSentCallbackonSend方法中传递的onSend ,并传递新发送的消息的ID。

send方法也是异步的

private void send(final AmazonSQS sqs, final String queueURL, final String message, final MessageSentCallback callback) {pool.execute(new Runnable() {public void run() {SendMessageResult res = sqs.sendMessage(new SendMessageRequest(queueURL, message));if (callback != null) {callback.onSend(res.getMessageId());}}});
}

顺便说一下,AWS Java SDK 确实提供了一个异步客户端 。 但是,此客户端的实现利用了Java的Futures 。 尽管Futures是一个简洁的概念 ,但Ahoy!的实现比Futures更方便( 至少对我来说以及我使用SQS的方式 ),因为一旦发送或接收消息,就不会涉及任何轮询。

虽然不一定在Java中本地支持回调,但是您可以很好地模拟它们并实现与JavaScript相同的代码简洁性。 而且,如果您需要方便的方法来与AWS SQS进行交互,请给Ahoy! 尝试一下 ! 你能挖出来吗,伙计?

参考: 嗨,有回调! 来自The Disco Blog博客的JCG合作伙伴 Andrew Glover。

翻译自: https://www.javacodegeeks.com/2013/10/ahoy-there-callbacks.html

回调函数中有回调函数吗

回调函数中有回调函数吗_嗨,那里有回调!相关推荐

  1. mysql 钩子_回调函数和钩子函数的区别

    在消息处理机制中必不可少的一组CP,即回调和钩子. 钩子的概念源于Windows的消息处理机制,通过设置钩子,应用程序可以对所有的消息事件进行拦截,然后执行钩子函数,对消息进行想要的处理方式. 接下来 ...

  2. php回调函数和匿名函数吗,php回调函数_关于php中匿名函数与回调函数的详解

    摘要 腾兴网为您分享:关于php中匿名函数与回调函数的详解,壹学车,小天才,尚游戏,厦门百姓等软件知识,以及微信一键转发工具,幸运抽奖系统,文字识别app,垃圾清理管家,王者荣耀起名神器,叮咚出行,世 ...

  3. Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]

    1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...

  4. c语言中的钩子函数,回调函数以及钩子函数的概念

    钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即可以加工处理(改变)该消息,也可 ...

  5. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  6. 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)

    函数进阶 递归函数 回调函数 闭包函数 特点 匿名函数 lambda 表达式 迭代器 iter() next() 迭代器的取值方案 迭代器取值特点,取一个少一个,直到都取完,最后再获取就会报错 检测迭 ...

  7. 函数 php_PHP回调函数及匿名函数概念与用法详解

    1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...

  8. java回调函数_PHP回调函数及匿名函数概念与用法详解

    1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...

  9. reactjs回调函数形式的ref:含内联形式回调函数调用次数问题

    reactjs回调函数形式的ref:含内联形式回调函数调用次数问题

最新文章

  1. 在项目中使用Google Closure Compiler
  2. 用Access作为后台数据库支撑,书写一个C#写入记录的案例
  3. 1121:计算矩阵边缘元素之和
  4. SpringBoot整合 Shiro
  5. 什么是javax.ws.rs.core.context? [第4部分]
  6. Windows Vista和局域网聊天的计算机
  7. c#modbus tcp通讯助手开源_RS485和Modbus知识点汇总
  8. java内存溢出前端_【面试笔录】内存溢出和内存泄漏
  9. 安装ffmpeg及nginx模块
  10. java byte数组打印
  11. 动态代理-cglib
  12. 精准测试系列产品白皮书2020版
  13. 卸载过 IE浏览器,再安装提示“安装程序无法继续,因为你的计算机上安装了新的 Internet Explorer” ,cv 别人的IE浏览器安装文件夹打开 iexplore.exe 窗口闪一下又关掉了
  14. 逻辑回归实现鸢尾花分类
  15. C#基础代码笔记(四)
  16. bzoj1236 KPSUM bzoj2900 好玩的数字游戏
  17. AcWing 2048. 干草
  18. zip格式压缩文件并打包下载
  19. 针对ONION勒索病毒!如何关闭139端口及445端口等危险端口
  20. pytorch优化器详解:Adam

热门文章

  1. 费用流-Wannafly Day2 TwoGraph-神题
  2. Sentinel(五)之流量控制
  3. JavaFX仿windows文件管理器目录树
  4. JavaFX Chart设置数值显示
  5. 漫画:什么是优先队列
  6. 达到年薪 40W 必需掌握的技术。
  7. 《金色梦乡》金句摘抄(三)
  8. 《白鹿原》金句摘抄(三)
  9. 2016蓝桥杯省赛---java---B---3(平方怪圈)
  10. 用rollback()VS不用rollback()