natty的异步通信框架_OpenHub框架进行的异步通信

natty的异步通信框架

在本系列的前一部分中,我们介绍了OpenHub框架 。 这部分显示了框架最强大的功能之一- 异步消息传递模型 。

当源系统无法等待目标系统的响应时,将使用系统之间的异步通信。 有以下几个原因:

  • 源系统必须尽可能地响应 ,并且不受外部影响(通信缓慢,目标系统不稳定等)的影响
  • 在目标系统中处理需要很多时间
  • 异步通信对性能和流量产生积极影响

异步方案

当您决定异步通信时,您必须考虑可能的情况:

  • 目标系统必须确认传入消息已成功保存 ,并准备进行进一步处理。 是否应将异步过程的最终结果通知源系统
  • 如果异步处理失败该怎么办? 如果存在暂时性技术错误 (例如,与另一个系统的通信失败), 请尝试几次,或者因为存在业务错误 (例如,输入数据无效)而停止进一步处理
  • 在异步处理期间会调用其他系统- 如果对第一个系统的调用可以,但对第二个系统的调用失败,该怎么办? 异步处理必须是幂等的,并跳过第一个成功的呼叫,然后仅重试第二个呼叫。
  • 异步过程可能很棘手,因此最好将一个大进程(父)划分为较小的(子)进程 。 如果处理了子进程,则父进程也将完成。
  • 有时,您必须保证传入请求的顺序 (请求的到达顺序与发送的顺序不相同)并按照确切的顺序进行处理。
  • 它是异步处理,您需要对其进行监视或在发生意外情况 (例如异步过程失败) 时自动得到通知
  • 有时,您需要保存数据或异步过程的当前状态以尝试成功完成之间,例如,第一次调用外部系统的结果就是第二次调用的输入。

当您开始考虑所有这些情况时,您会发现从头开始实施它并不容易。 OpenHub框架内置了对异步消息处理的支持。 它易于使用,但同时又强大又灵活。 并且也是可配置的,例如,该过程应再次运行多少次? 在哪个时间间隔?

异步路由实现

使用OpenHub框架的路由实现有两个子路由:

  • 一种用于处理传入消息( RouteIn
  • 一种用于异步过程实现( RouteOut
/*** Route definition for asynchronous operation "translate" via web services.*/
@CamelConfiguration(value = AsyncTranslateWsRoute.ROUTE_BEAN)
public class AsyncTranslateWsRoute extends AbstractBasicRoute {static final String ROUTE_BEAN = "asyncTranslateWsRouteBean";private static final String OPERATION_NAME = "asyncTranslateWs";static final String ROUTE_ID_ASYNC_IN = getInRouteId(ServiceEnum.TRANSLATE, OPERATION_NAME);static final String ROUTE_ID_ASYNC_OUT = getOutRouteId(ServiceEnum.TRANSLATE, OPERATION_NAME);static final String URI_ASYNC_OUT = "direct:" + ROUTE_ID_ASYNC_OUT;@Overrideprotected void doConfigure() throws Exception {// asyncTranslate - input asynch messagecreateAsyncRouteIn();// asyncTranslate - process delivery (=asynchronous execution)createAsyncRouteOut();}/*** Route for asynchronous <strong>asyncTranslate</strong> input operation.* <p/>* Prerequisite: none* <p/>* Output: {@link AsyncTranslateResponse}*/private void createAsyncRouteIn() {Namespaces ns = new Namespaces("h", TranslateWebServiceConfig.TRANSLATE_SERVICE_NS);// note: mandatory parameters are set already in XSD, this validation is extraXPathValidator validator = new XPathValidator("/h:asyncTranslateRequest", ns, "h:inputText");AsynchRouteBuilder.newInstance(ServiceEnum.TRANSLATE, OPERATION_NAME,getInWsUri(new QName(TranslateWebServiceConfig.TRANSLATE_SERVICE_NS, "asyncTranslateRequest")),new AsynchResponseProcessor() {@Overrideprotected Object setCallbackResponse(CallbackResponse callbackResponse) {AsyncTranslateResponse res = new AsyncTranslateResponse();res.setConfirmAsyncTranslate(callbackResponse);return res;}}, jaxb(AsyncTranslateResponse.class)).withValidator(validator).build(this);}/*** Route for <strong>asyncTranslate</strong> operation - process delivery (=asynchronous execution).* Only input text is logged in this case.* <p/>* Prerequisite: none*/private void createAsyncRouteOut() {final String URI_LOG_INPUT_PARAMS = "direct:logInputParams";from(URI_ASYNC_OUT).routeId(ROUTE_ID_ASYNC_OUT)// xml -> AsyncTranslateRequest.unmarshal(jaxb(AsyncTranslateRequest.class)).to("extcall:message:" + URI_LOG_INPUT_PARAMS);from(URI_LOG_INPUT_PARAMS).validate(body().isInstanceOf(AsyncTranslateRequest.class)).log(LoggingLevel.DEBUG, "Asynchronous execution - input text '${body.inputText}' (lang: ${body.inputLang})");}
}

RouteIn使用AsynchRouteBuilder通过以下功能轻松配置:

  • 定义哪个传入的Web Service请求应开始此路由
  • 定义源系统的确认响应。 输入路由成功执行后,将返回对源系统的同步响应。
  • 定义验证器,该验证器检查传入请求中是否存在元素inputText

RouteOut定义了异步过程本身。 在这种情况下,仅记录输入请求( AsyncTranslateRequest )。

就这样。 周围的一切都由OpenHub框架实现。

外部通话

您的路线实施通常会调用外部系统或其他路线。 如果实现异步过程,则必须遵守幂等规则-可以多次调用过程的每个部分,并且必须确保所有调用的行为相同。 有时外部系统/路由本身是幂等的,然后您可以根据需要多次调用它。 如果没有,那么您必须在实现中对其进行控制。 因此,我们将Camel组件设为extcall

上例中的组件excall确保即使整个异步过程运行了多次,使用URI_LOG_INPUT_PARAMS路由也会被精确地调用一次。

External call explaination

外部通话说明

描述:

  • 在异步消息处理期间调用了两个外部系统
  • 在处理过程中我们可以返回两个extcall的停靠点
    • 如果在对外部系统1的第一次请求之前发生错误,则下一个处理尝试将从头开始,与新消息到达相同

漏斗和节流组件

其他强大的组件是funnelthrottling

Funnel组件用于过滤特定集成点处的并发消息。 这种过滤可确保在该位置仅处理一个特定类型的消息或同时具有特定信息的消息,即使是以保证的顺序(可选选项)进行处理。 对于与外部系统进行通信很有用,该外部系统一次只能接受一个特定实体(例如,订购系统中的一个特定客户)的一条输入消息。

第二个组件throttling允许您确保特定端点不会过载,或者我们不会超出任何外部服务的商定SLA。 Throttling组件也可以用于同步消息。

所有组件都支持群集。

实施细节

OpenHub需要保存的所有内容都保存在数据库中–类型没有限制。 无需调整JMS / MQ系统即可支持异步消息传递。 然后,您可以使用自己喜欢的任何工具进行日常工作- 数据模型简单,清晰并且文档齐全。 数据库工具比JMS / MQ系统更多。

有时我们听说在这种情况下使用数据库是一种反模式,从性能的角度来看,在某些情况下它可能是瓶颈。 这取决于实际项目中的集成用例,但在处理数十万个并发请求的实际项目中,我们仍然没有严格的性能限制。 我们准备添加JMS / MQ实现,但是到目前为止还不需要。

不必仅通过传入请求启动异步过程–您还可以使用调度作业在需要的任何时候启动路由,然后将其留给OpenHub框架。

所有示例都可以在GitHub的参考实现中找到–参见https://github.com/OpenWiseSolutions/openhub-ri

翻译自: https://www.javacodegeeks.com/2017/10/asynchronous-communication-made-openhub-framework.html

natty的异步通信框架

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

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

相关文章

java大文件解析_java大文件(百M以上)的上传下载实例解析

javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求&#xff0c;也可以使用 ajax向后端发请求1.通过form表单向后端发送请求Save改进后的代码不需要form标签&#xff0c;直接由控件来实现。开发人员只需要关注业务逻辑即可。JS中已经帮我们封闭好了…

zip直链生成网站_安装网站程序

一、选择网站程序搭建网站的程序有很多博客类&#xff1a; WordPress、 Typecho 、Hexo 等商城类&#xff1a;EcShop、DBShop、NiuShop 等论坛类&#xff1a;Discuz 还有 苹果CMS-影视建站&#xff1b;Tipask-问答程序&#xff1b;可道云KodExplorer-强大易用的私有云/在线文档…

mega x_[MEGA DEAL]通过Hadoop Bundle掌握大数据(91%的折扣)

mega x通过44个小时的广泛Hadoop培训来驯服海量数据集 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了另一个超值优惠 。 通过Hadoop Bundle&#xff0c;我们可以提供91&#xff05;的 大数据精通 折扣 。 现在只需39美元…

c++ 提取傅里叶描述子_AI大语音(四)——MFCC特征提取(深度解析)

1 特征提取流程在语音识别和话者识别方面&#xff0c;最常用到的语音特征就是梅尔倒谱系数&#xff08;Mel-scaleFrequency Cepstral Coefficients&#xff0c;简称MFCC&#xff09;。MFCC提取过程包括预处理、快速傅里叶变换、Mei滤波器组、对数运算、离散余弦变换、动态特征提…

Linux 命令之 grep -- 强大的文本搜索工具/正则表达式搜索

文章目录一、命令介绍二、grep 的三种形式三、常用选项四、正则表达式五、参考示例在指定的文件中查找指定的关键词查看指定文件中含有特定关键词的文本行查看指定文件中所有包含数字的行在指定的目录下递归搜索指定的字符串&#xff0c;将符合的文本行及其文件名输出在指定文件…

java me基础教程 pdf_Java ME手机应用开发技术与案例详解 PDF

资源名称&#xff1a;Java ME手机应用开发技术与案例详解 PDFJava ME手机应用开发技术与案例详解基于Java ME&#xff0c;系统描述了Java ME手机应用开发的各个方面。全书按照Java ME程序的开发流程合理编排内容&#xff0c;分成3个部分依次讲述。第1部分包括第1章-第5章&#…

cli parser_Java命令行界面(第27部分):cli-parser

cli parserCLI Parser最初托管在Google Code上&#xff0c;现在已存档在Google Code上 &#xff0c;现在可以在GitHub上使用 。 Google Code项目档案页面将CLI Parser描述为“使用非常简单&#xff0c;非常小的依赖项”&#xff0c;它使用注释“使非常简洁的主要方法不需要知道…

写一个sql实现以下查询结果_书写高质量SQL的30条建议

以下文章来源&#xff1a;后端程序员必备&#xff1a;书写高质量SQL的30条建议1、查询SQL尽量不要使用select *&#xff0c;而是select具体字段。反例子&#xff1a;select * from employee;正例子&#xff1a;select id&#xff0c;name from employee;理由&#xff1a;只取需…

sendkeys.send 始终输出英文._PLC的三种输出方式,你知道有哪些吗?

电工技术维修学习网&#xff1a;www.dgjswx.com关注电工技术维修学习网官方微信公众号《电工维修学习》收获更多电工经验知识和提升实战技能电工技术&#xff0c;电气知识&#xff0c;电工基础知识&#xff0c;电工入门知识&#xff0c;电工资料&#xff0c;电工软件&#xff0…

java 死循环排查_java应用死循环排查方法或查找程序消耗资源的线程方法(面试)...

今天遇到一个面试&#xff0c;怎么在一堆线程中查找一个死循环&#xff1f;如果遇到线上应用cpu飙升&#xff0c;并出现OutOfMemery怎么办&#xff1f;首先线上应用的jvm配置要养成良好的习惯&#xff0c;增加一下配置则可以在jvm发生 oom的时候自动dump日志了 -XX:HeapDumpOn…

jw摄像_Java命令行界面(第17部分):jw-options

jw摄像JavaWorld的文章“ 用Java处理命令行参数”&#xff1a; Matthias Laux博士关闭的案例介绍了一个简单的基于Java的库&#xff0c;用于处理命令行参数 &#xff0c;我在本文中将其称为jw-options 。 被引用的文章提供了有关为何在构造Options类时做出某些设计决策的背景信…

pixel和毫米怎么换算_压力传感器相关压力单位换算

压力传感器的应用已经很普遍了&#xff0c;压力传感器各个单间之间应该怎么换算呢&#xff0c;这个问题困扰着很多的客户&#xff0c;今天呢我们就来说一下它们之间的换算。在实际的工程应用中&#xff0c;压强单位常被当作压力单位。比较常见的压力单位包括&#xff1a;bar、K…

mongodb json_在MongoDB和Spring Batch中将XML转换为JSON和原始使用

mongodb json总览 为什么将XML转换为JSON以在MongoDB中原始使用&#xff1f; 由于MongoDB使用JSON文档存储记录&#xff0c;就像表和行将记录存储在关系数据库中一样&#xff0c;我们自然需要将XML转换为JSON。 某些应用程序可能需要存储原始&#xff08;未修改的&#xff09;…

java串口发送16进制数据_MFC串口通信发送16进制数据的方法

本文实例为大家分享了MFC串口通信发送16进制数据的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下MFC串口通信会使用m_mscomm控件。发送数据一般是在edit control 里输入自己想发送的内容&#xff0c;然后点击send button。如果直接发送字符串内容&#xff0c;通过下…

python集合和字典的区别_Python中的字典和集合

导语&#xff1a;本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得&#xff0c;打算入门Python的朋友们可以来一起学习并交流。 本文重点&#xff1a; 1、掌握常见的字典创建&#xff0c;查询&#xff0c;判别方法&#xff1b; 2、了解字典中的defaultdict、…

apache ignite_Apache Ignite本机持久性,简要概述

apache ignite通过将数据的工作集放入系统内存中&#xff0c;内存中方法可以达到极高的速度。 当所有数据都保存在内存中后&#xff0c;就不再需要处理使用传统旋转磁盘引起的问题。 例如&#xff0c;这意味着无需维护数据的其他缓存副本并管理它们之间的同步。 但是这种方法还…

java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索

java jigsawJava 9由于Jigsaw项目而延迟了很多次&#xff0c;您可能会听到很多关于模块&#xff0c;模块化和其他内容的信息&#xff0c;那么&#xff0c;这到底是什么呢&#xff1f; 什么是模块化&#xff0c;模块化平台是什么意思&#xff1f; Java平台模块系统&#xff08;J…

mysql explain 为空_车祸现场!我的MySQL千万级数据表选错索引了!

最近在线上环境遇到了一次SQL慢查询引发的数据库故障&#xff0c;影响线上业务。经过排查后&#xff0c;确定原因是&#xff1a;SQL在执行时&#xff0c;MySQL优化器选择了错误的索引(不应该说是“错误”&#xff0c;而是选择了实际执行耗时更长的索引)。排查过程中&#xff0c…

java登录界面命令_Java命令行界面(第25部分):JCommando

java登录界面命令JCommando 网站 上将JCommando描述为“命令行参数的Java参数解析器”。 JCommando读取XML配置以生成一个Java类&#xff0c;该类处理Java应用程序中的解析。 在提供XML配置的 Java命令行解析库的本系列文章中&#xff0c;以前涵盖的唯一基于Java的库是JSAP &am…

数据追加用什么函数_RL用算法发现算法:DeepMind 数据驱动「价值函数」自我更新,14款Atari游戏完虐人类!...

【新智元导读】击败卡斯帕罗夫的「深蓝」并不是真正的人工智能&#xff0c;它过度依赖了人类设计的规则&#xff0c;而最近DeepMind的一项深度强化学习新研究表明&#xff0c;不用人工介入&#xff0c;完全数据驱动&#xff0c;算法自己就能发现算法。「深蓝」并非以智取胜&…