回调函数中有回调函数吗_嗨,那里有回调!
回调函数中有回调函数吗
因为是我的书包,所以我喜欢JavaScript 。 实际上,我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此,当我发现自己处于非JavaScript环境中时(例如Java) ,我往往会错过使用回调的机会。
好消息是您可以在Java中模拟异步回调。 实际上,我最近在一个我称为Ahoy的图书馆中做到了这一点! ,这是适用于AWS的Java SQS库的异步SQS适配器 。
对于初学者来说, SQS是一个基于云的消息传递平台 –使用SQS,您可以创建队列并将消息放入这些队列,然后可以稍后或通过其他某个过程或相同的确切过程读取这些消息。 所有这些都利用了Amazon的大规模冗余架构,在面对并发访问时提供了极高的可用性。
Java中的异步回调可以通过两个功能实现:匿名类(包含一个方法)和Java的java.util.concurrent
包。
因为Java不允许您轻松地将函数(或方法)作为参数传递,以模拟回调,所以您可以创建一个包含一个基本上模仿函数的方法的接口。 对于Ahoy,有两个接口: MessageSendCallback
和MessageReceivedCallback
–都有一个方法:分别是onSend
和onReceive
。 因此,Ahooy!的主要类被称为SQSAdapter
, SQSAdapter
公开了两个简单的方法: send
和receive
并且都采用了它们相关的回调接口。
要理解的最直接的回调是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
实例,该实例发送特定的消息并调用MessageSentCallback
的onSend
方法中传递的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! 尝试一下 ! 你能挖出来吗,伙计?
翻译自: https://www.javacodegeeks.com/2013/10/ahoy-there-callbacks.html
回调函数中有回调函数吗
回调函数中有回调函数吗_嗨,那里有回调!相关推荐
- mysql 钩子_回调函数和钩子函数的区别
在消息处理机制中必不可少的一组CP,即回调和钩子. 钩子的概念源于Windows的消息处理机制,通过设置钩子,应用程序可以对所有的消息事件进行拦截,然后执行钩子函数,对消息进行想要的处理方式. 接下来 ...
- php回调函数和匿名函数吗,php回调函数_关于php中匿名函数与回调函数的详解
摘要 腾兴网为您分享:关于php中匿名函数与回调函数的详解,壹学车,小天才,尚游戏,厦门百姓等软件知识,以及微信一键转发工具,幸运抽奖系统,文字识别app,垃圾清理管家,王者荣耀起名神器,叮咚出行,世 ...
- Go 学习笔记(16)— 函数(02)[函数签名、有名函数、匿名函数、调用匿名函数、匿名函数赋值给变量、匿名函数做回调函数]
1. 函数签名 函数类型也叫做函数签名,可以使用 fmt.Printf("%T") 格式化参数打印函数类型. package mainimport "fmt"f ...
- c语言中的钩子函数,回调函数以及钩子函数的概念
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即可以加工处理(改变)该消息,也可 ...
- C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转
目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...
- 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)
函数进阶 递归函数 回调函数 闭包函数 特点 匿名函数 lambda 表达式 迭代器 iter() next() 迭代器的取值方案 迭代器取值特点,取一个少一个,直到都取完,最后再获取就会报错 检测迭 ...
- 函数 php_PHP回调函数及匿名函数概念与用法详解
1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...
- java回调函数_PHP回调函数及匿名函数概念与用法详解
1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...
- reactjs回调函数形式的ref:含内联形式回调函数调用次数问题
reactjs回调函数形式的ref:含内联形式回调函数调用次数问题
最新文章
- 在项目中使用Google Closure Compiler
- 用Access作为后台数据库支撑,书写一个C#写入记录的案例
- 1121:计算矩阵边缘元素之和
- SpringBoot整合 Shiro
- 什么是javax.ws.rs.core.context? [第4部分]
- Windows Vista和局域网聊天的计算机
- c#modbus tcp通讯助手开源_RS485和Modbus知识点汇总
- java内存溢出前端_【面试笔录】内存溢出和内存泄漏
- 安装ffmpeg及nginx模块
- java byte数组打印
- 动态代理-cglib
- 精准测试系列产品白皮书2020版
- 卸载过 IE浏览器,再安装提示“安装程序无法继续,因为你的计算机上安装了新的 Internet Explorer” ,cv 别人的IE浏览器安装文件夹打开 iexplore.exe 窗口闪一下又关掉了
- 逻辑回归实现鸢尾花分类
- C#基础代码笔记(四)
- bzoj1236 KPSUM bzoj2900 好玩的数字游戏
- AcWing 2048. 干草
- zip格式压缩文件并打包下载
- 针对ONION勒索病毒!如何关闭139端口及445端口等危险端口
- pytorch优化器详解:Adam