OpenHub框架进行的异步通信

在本系列的前一部分中,我们介绍了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

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

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

相关文章

Java实现C语言select函数_一道面试题目,分别用sql 和java,c++, c语言实现,

引用来自“雨翔河”的评论获取国家假日办的的信息&#xff0c;然后根据假日办提供的信息来搞定。日期的话&#xff0c;哈哈&#xff0c;找个提供日期查询的接口&#xff0c;借用一下来查日期&#xff0c;也搞定了。总之哪里有的抄就抄哪里的。再来一个笨蛋的意见&#xff0c;把…

java注解的反射_Java注解与反射

概要本文主要是总结Java注解与反射的相关知识&#xff0c;加深自己对Java类动态语言的理解&#xff0c;同时为日后学习Spring打下基础。注解&#xff1a;什么是注解Annotation的作用不是程序本身&#xff0c;但是可以对程序作出解释。可以被其他程序(比如&#xff1a;编译器等)…

工厂设计模式和策略设计模式_设计模式:策略

工厂设计模式和策略设计模式这次我想谈谈策略设计模式 。 通过这种方式&#xff0c;我开始撰写有关行为设计模式的文章。 这种模式表示对象之间的某些交互模式&#xff0c;以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的…

java 8 排序反转_Java 8 排序小结

1、概述首先&#xff0c;让我们先定义一个简单的实体类&#xff1a;Datapublic class Human {private String name;private int age;public Human() {super();}public Human(final String name, final int age) {super();this.name name;this.age age;}}2、不使用Lambda表达式…

如何将不带web.xml的Spring应用程序部署到Tomcat

介绍 由于Servlet 3规范不再需要web.xml来配置Web应用程序&#xff0c;因此已通过使用注释代替。 在本文中&#xff0c;我们将研究如何在不使用web.xml情况下将简单的基于Spring的应用程序部署到Tomcat 8.5。*。 创建一个空的应用程序 使用以下命令使用maven webapp原型创建一…

java创建单线程计时器_我们如何在Java中实现计时器线程?

该定时器类计划任务一次或多次给定的时间运行。它也可以作为后台程序线程在后台运行。要将Timer与守护程序线程相关联&#xff0c;有一个带有布尔值的构造函数。计时器以固定的延迟和固定的速率安排任务。在固定的延迟中&#xff0c;如果系统GC延迟了任何执行&#xff0c;则其他…

Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...

资源介绍课程简介:xa0xa0Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 教学视频----------------------课程目录Python项目实战篇[初级项目&#xff1a;图片社交电商导购漂流瓶]项目实现功能&#xff1a; 用户注册&#xff0c;登录&#xff0c;登出图片的多种…

java04376_Java - jdbc mybatis

jdbc首先配置maven包org.springframework.bootspring-boot-starter-jdbcorg.mybatis.spring.bootmybatis-spring-boot-starter2.1.0注意pom.xml中配置结点src/main/java**/*.xmlfalsesrc/main/resourcesstatic/*.*templates/*.***/*.xml**/*.yml**/*.propertiesfalse针对不同的…

设计模式 建造者模式_设计模式:建造者

设计模式 建造者模式有时需要在应用程序中创建一个复杂的对象。 一种解决方案是Factory模式&#xff0c;另一种是Builder设计模式。 在某些情况下&#xff0c;您甚至可以结合使用这两种模式。 但是在本文中&#xff0c;我想研究一下Builder设计模式 。 我需要说的第一件事是创造…

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

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

java hash=0报空指针_怎么报空指针异常错误?

源自&#xff1a;2-2 开发第一个自定义标签怎么报空指针异常错误&#xff1f;java.lang.NullPointerExceptionat org.apache.tomcat.util.descriptor.tld.TldResourcePath.hashCode(TldResourcePath.java:164)at java.util.HashMap.hash(HashMap.java:338)at java.util.HashMap…

php 跳回上一页_php – Laravel 5 – 登录后重定向回到上一页

我有一个页面上有一些内容和评论部分.注释只能由已登录的用户保留,因此我已将登录表单添加到页面以供用户登录(仅在他们尚未登录时显示).我遇到的问题是,当用户登录时,他们会被重定向回主页,而不是他们之前所在的页面.我还没有从开箱即用的设置中更改登录方法.任何人都可以建议…

java 垃圾回收手动回收_Java垃圾回收(1)

java 垃圾回收手动回收这是有关垃圾收集&#xff08;GC&#xff09;的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收以及不同回收器共有的元素。 我为什么要在乎&#xff1f; 您的Java虚拟机…

php mailer altbody,PHPMailer发送邮件中文乱码的解决办法

前面我们介绍了PHPMailer的使用方法和实例代码&#xff0c;有些朋友在使用的时候发现&#xff0c;发送中文邮件的时候&#xff0c;标题和内容中文都是乱码&#xff0c;这该如何解决呢&#xff1f;让我们先看一下之前给出的实例代码mail.php文件&#xff1a;require class.phpma…

使用Apache Isis快速进行SEMAT应用程序开发

TL; DR这篇文章谈论我使用Apache Isis创建并部署到此处的OpenShift Online的SEMAT宠物项目&#xff1a; http&#xff1a; //semat.ofbizian.com Apache Isis 作为主要在后端系统上工作的Java开发人员&#xff0c;我讨厌创建用户界面和处理Java脚本。 幸运的是&#xff0c;有J…

php smtp发送附件,PHP:如何使用smtp设置发送带附件的电子邮件?

发现此代码是google&#xff1a;// pear邮件附件搜索的首批点击之一.include(Mail.php);include(Mail/mime.php);$text Text version of email;$html HTML version of email;$file ./files/example.zip;$crlf "rn";$hdrs array(From > someonedomain.pl,To &…

java 对象锁定_少锁定Java对象池

java 对象锁定自从我写任何东西以来已经有一段时间了&#xff0c;我一直在忙于我的新工作&#xff0c;其中涉及在性能调优方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。 尽管Java随着时间的推移已改进了GC算法&#xff0c;但垃圾回收打ic一直是Java的主…

php怎么检查输入名称,PHP |通过$_POST []获取输入名称

HTML示例&#xff1a;用户填写输入字段&#xff1a;dfgdfg.comecho $_POST[email]; //output: dfgdfg.com表单中每个输入的名称和值都将发送到服务器.有没有办法获得名称属性&#xff1f;所以像..echo $_POST[email].name; //output: email编辑&#xff1a;澄清对我的问题的一些…

使用Speedment 3.0.17及更高版本简化交易

交易次数 有时我们想确保我们的数据库操作是原子执行的&#xff0c;并且与其他操作分开。 这是交易起作用的地方。 交易是一组操作 数据库可能接受或不接受作为原子操作的建议。 因此&#xff0c;要么接受交易中的所有操作&#xff0c;要么不接受交易中的所有操作。 事务的另一…

图像二值化 php im2bw,图像二值化-MATLAB实现

1.图像二值化代码&#xff1a;Aimread(hw1.chips1.GIF); %读取到一张图片%thresh graythresh(A); %自动确定二值化阈值I2 im2bw(A,120/255); %对图像二值化figure();subplot(1,2,1);imshow(A); %显示二值化之前的图片title(原图);subplot(1,2,2);imshow(I2); %显示二值化之后…