回调函数中有回调函数吗_嗨,那里有回调!

回调函数中有回调函数吗

因为是我的书包,所以我喜欢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

回调函数中有回调函数吗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的django_django能用来做什么

Django是什么 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MT‘V的框架模式&#xff0c;即模型M&#xff0c;模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&#xff08;内容管理系统&am…

小程序确定取消弹窗_浅析微信小程序modal弹窗关闭默认会执行cancel问题

在我们使用小程序的modal组件时候&#xff0c;有的时候会碰到一个问题&#xff0c;那就是弹框的关闭&#xff0c;我们并没有选择取消或确定&#xff0c;而是点击弹框之外的部分&#xff0c;这个时候弹框会关闭&#xff0c;按理来说不会触发取消和确定的绑定事件&#xff0c;但是…

android n 发布时间,Android N 正式版将在9月发布

【环球科技综合报道】据外媒5月8日报道&#xff0c;谷歌预计将在9月份放出正式版Android N。三星、华为、LG、HTC和黑莓等品牌手机将获Android N升级。此前谷歌发出的路线图中的升级安排&#xff1a;3月: Android N 开发者预览版 1 (alpha)4月: Android N 开发者预览版 2 (beta…

ios realm 文件_关于ios:具有后台进程的Realm实例会丢失数据

我将Realm for Swift与仅内存配置一起使用。 由于在后台线程中更新数据库&#xff0c;因此每次使用时都会创建一个Realm实例。 在Realm文档中提到了此问题&#xff0c;这里还有另一个问题https://stackoverflow.com/a/45375608/613121。但是通过测试数据库&#xff0c;我注意到…

datatable如何生成级联数据_如何把Excel表数据批量生成条形码

条形码属于一维条码&#xff0c;是将宽度不等的多个黑条和空白&#xff0c;按照一定的编码规则排列&#xff0c;用以表达一组信息的图形标识符&#xff0c;条形码的种类比较多&#xff0c;比如常用的Code128码&#xff0c;Code39码&#xff0c;Code93码&#xff0c;EAN-13码&am…

android数字累加,Android自己设置View之数字自动增长

第一次写文&#xff0c;请多指教&#xff0c;有何问题及改进建议都可以告诉我-.-Idea来自金山词霸App的单词计数&#xff0c;下面先放图autoNumber.gif如上图&#xff0c;就是&#xff0c;下面开始进入自己设置View自己设置View步骤1. 自己设置属性2. 生成构造方法3. onMeasure…

spring条件注解有哪些_Spring4有条件

spring条件注解有哪些Spring 4引入了一个称为Conditional的新功能&#xff0c;该功能针对于生成bean的Spring组件&#xff0c;并注视这些bean的生成&#xff0c;实质上&#xff0c;它提供了一种条件生成bean的方法。 考虑一个简单的例子&#xff1a; 我有一个名为“ Customer…

settimeout怎么用_怎么实现一个3d翻书效果

本篇主要讨论以下两种翻书动画的实现&#xff1a;第一种是整页翻转的效果&#xff1a;这种整页翻转的效果主要是做rotateY的动画&#xff0c;并结合一些CSS的3d属性实现。第二种折线翻转的效果&#xff0c;如下图所示&#xff1a;主要是通过计算页面翻折过来的位置。这两种原理…

springboot怎么返回404_SpringBoot(二十)_404返回统一异常处理结果

1.修改application.properties文件# 自定义404#出现错误时, 直接抛出异常spring.mvc.throw-exception-if-no-handler-foundtrue#不要为我们工程中的资源文件建立映射spring.resources.add-mappingsfalse2.添加controller增强处理if (e instanceof NoHandlerFoundException) {re…

android 通知垃圾回收,Android中垃圾回收日志信息

原因GC_CONCURRENTfreed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms2msGC_EXPLICITfreed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms红颜色标出的部分就是垃圾回收触发的原因。在Android中有五种类型的垃圾回收触发原因。GC_CONCURRENT当堆内存增长…

5个令人震惊的统计数据证明日志不足

事实证明&#xff0c;我们都犯有记录不当行为的罪行。 不相信我们吗&#xff1f; 这些统计数据可能会改变您的想法 当人们提出带有明显答案的问题时&#xff0c;这非常令人不快&#xff0c;因此&#xff0c;我不会坐在这里问您和您的团队是否使用日志文件来监视预生产和生产环…

linearregression_机器学习-TensorFlow建模过程 Linear Regression线性拟合应用

TensorFlow是咱们机器学习领域非常常用的一个组件&#xff0c;它在数据处理&#xff0c;模型建立&#xff0c;模型验证等等关于机器学习方面的领域都有很好的表现&#xff0c;前面的一节我已经简单介绍了一下TensorFlow里面基础的数据结构即&#xff1a;Tensor和Dataset&#x…

yum配置文件 重启后还原_江湖救急 : CentOS7.5 /usr 目录误删, 恢复操作.

一.概述前两天在网上找了个脚本,看着没问题,直接复制粘贴了. 结果有特殊字符,直接换行.执行了 rm -rf /usr 目录. 然后就傻了,各种操作命令找不到, 无法登陆.......万分幸运的是,数据没丢,要是丢了.那我就要命了1.如果可以进入操作系统,并且可以正常操作的话. 依旧会存在隐患.…

html页面调用存储过程,用WebBrowser实现HTML界面的应用

HTML的界面有以下特点&#xff1a;图文混排&#xff0c;格式灵活&#xff0c;可以包含Flash、声音和视频等&#xff0c;实现图文声像的多媒体界面&#xff0c;而且易于建立和维护。另外&#xff0c;HTML的显示环境一般机器上都具备&#xff0c;通常不需要安装额外的软件。当然&…

凡事多找找自己的原因_布袋除尘器灰斗积粉过多、堵灰该咋办?别急,从这8个方面找原因...

灰斗布置在袋室的下部&#xff0c;它除了存放收集下来的粉尘以外&#xff0c;还作为下进气总管使用&#xff0c;当含尘气体进入袋室前先进入灰斗&#xff0c;由于灰斗内容积较大&#xff0c;使得气流速度降低&#xff0c;加之气流方向的改变&#xff0c;使得较粗的尘粒在这里得…

javaone_Javaone 2013评论

javaonetl; dr我今年再次参加了Javaone。 好玩。 星期日 会议于周日开幕&#xff0c;进行了用户组会议和主要主题演讲。 由于我正在运行Java大学关于Java SE 7和8的新功能的培训课程&#xff0c;因此我实际上无法参加这些课程。该课程涵盖了Java 7的项目硬币&#xff0c;NIO 2…

python怎么改变字体大小_Python-docx 整体修改或者部分修改文字的大小和字体类型...

Python中可以用docx来生成word文档&#xff0c;docx中可以自定义文字的大小和字体等。 其中要整体修改文字的字体大小和字体&#xff0c;可以用以下方法&#xff1a; newfile docx.Document() newfile.styles[Normal].font.name Times New Roman newfile.styles[Normal]._ele…

html输入框点击后去掉默认文字颜色,input的一些默认样式的更改

1.Chrome浏览器下&#xff0c;记住密码之后&#xff0c;输入框为黄色的背景&#xff0c;/*忘记密码后的黄色背景的去除*//*只对非透明的纯色背景有效*/input:-webkit-autofill{-webkit-box-shadow: 0 0 0 1000px white inset !important;}/*适用于背景为透明色的输入框*/input:…

cad设计院常用字体_如何把CAD图纸坐标转换成现场坐标?

使用CAD软件画建筑施工图是很常见的&#xff0c;特别是在施工现场&#xff0c;为了不受现场场地落差的影响&#xff0c;需要使用全站仪&#xff0c;但是使用全站仪需要把CAD图纸转换成CAD坐标&#xff0c;很多人可能并不知道该怎么转换&#xff0c;下面我们就来介绍一下如何把图…

sqlserver select 数值精度_SQL Server读懂语句运行 (二) SET STATISTICS IO ON

对于语句的运行&#xff0c;除了执行计划本身&#xff0c;还有一些其他因素要考虑&#xff0c;例如语句的编译时间、执行时间、做了多少次磁盘读等。这些信息对分析问题很有价值。1 SET STATISTICS TIME ON 2 SET STATISTICS IO ON 3 SET STATISTICS PROFILE ON今天&#xff0c…