{"id":69712,"date":"2017-10-17T16:00:00","date_gmt":"2017-10-17T13:00:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=69712"},"modified":"2017-10-17T12:22:30","modified_gmt":"2017-10-17T09:22:30","slug":"asynchronous-communication-made-openhub-framework","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html","title":{"rendered":"Asynchronous communication made by OpenHub framework"},"content":{"rendered":"<p>We <a class=\"external-link\" href=\"https:\/\/www.javacodegeeks.com\/2017\/10\/introducing-openhub-framework.html\" rel=\"nofollow\">introduced OpenHub framework<\/a> in the previous part of this series. This part shows one of the most powerful feature of the framework &#8211;\u00a0<a class=\"external-link\" href=\"https:\/\/openhubframework.atlassian.net\/wiki\/spaces\/OHF\/pages\/33610\/Asynchronous+messages\" rel=\"nofollow\">asynchronous messaging model<\/a>.<\/p>\n<p>Asynchronous communication between systems is used when source system can&#8217;t wait for the response of the target system. There are several reasons:<\/p>\n<ul>\n<li><strong>source system must be responsive<\/strong> as much as possible and not be impacted by external influences (slow communication, unstable target system, etc.)<\/li>\n<li>processing in the target system <strong>takes a lot of time<\/strong><\/li>\n<li>asynchronous communication has <strong>positive impact on performance and traffic<\/strong><\/li>\n<\/ul>\n<h2 id=\"AsynchronousprocessingwithOpenHub-Asynchronousscenarious\">Asynchronous scenarios<\/h2>\n<p>When you decide to communicate asynchronously then you have to think over possible scenarios:<\/p>\n<ul>\n<li>Target system has to <strong>confirm that incoming message was sucessfully saved<\/strong> and is prepared for further processing. Should source system <strong>be notified about the final result of\u00a0asynchronous process?<\/strong><\/li>\n<li>What to do if\u00a0asynchronous processing fails? <strong>Try it several times if there is a temporal technical error<\/strong> (e.g. communication to another system fails) or <strong>stop further processing because there is business error\u00a0<\/strong>(e.g. input data is not valid).<\/li>\n<li>Other systems are called during\u00a0asynchronous processing &#8211; <strong>what to do if call to the first system is ok but call to the second system fails?<\/strong> Asynchronous processing has to be idempotent and skip first successful call and try again second call only.<\/li>\n<li>Asynchronous process <strong>can be tricky and then it would be good to divide one big process (parent) into smaller (child) processes<\/strong>. If children are processed then also parent process will be finished.<\/li>\n<li>Sometimes you have to <strong>guarantee order of the incoming requests <\/strong>(requests musn&#8217;t arrive at the same order as they were sent)\u00a0and process them in the exact order.<\/li>\n<li>It is\u00a0asynchronous processing and you need to <strong>monitor it or be notified automatically if something unexpected happens<\/strong>, e.g.\u00a0asynchronous process fails.<\/li>\n<li><strong>Sometimes you need to save data or current state of asynchronous process between attempts to finish it successfully,\u00a0<\/strong>e.g. result of the first call to external system is the input to the second call.<\/li>\n<\/ul>\n<p>When you start to think about all these scenarios then you find out it&#8217;s not simple to implement it from the scratch. There is <a href=\"http:\/\/www.openhub.cz\">OpenHub framework<\/a> with build-in support for processing of asynchronous messages. It&#8217;s easy to use but robust and flexible at the same time. And also configurable, e.g. how many times should process be run again? In which time intervals?<\/p>\n<h2 id=\"AsynchronousprocessingwithOpenHub-Asynchronousrouteimplementation\">Asynchronous route implementation<\/h2>\n<p><a class=\"external-link\" href=\"http:\/\/camel.apache.org\/routes.html\" rel=\"nofollow\">Route<\/a> implementation with OpenHub framework has two sub-routes:<\/p>\n<ul>\n<li>one for processing of incoming message (<code>RouteIn<\/code>)<\/li>\n<li>one for asynchronous process implementation (<code>RouteOut<\/code>)<\/li>\n<\/ul>\n<pre class=\"brush:java; wrap-lines:false\">\/**\r\n * Route definition for asynchronous operation \"translate\" via web services.\r\n *\/\r\n@CamelConfiguration(value = AsyncTranslateWsRoute.ROUTE_BEAN)\r\npublic class AsyncTranslateWsRoute extends AbstractBasicRoute {\r\n \r\n    static final String ROUTE_BEAN = \"asyncTranslateWsRouteBean\";\r\n \r\n    private static final String OPERATION_NAME = \"asyncTranslateWs\";\r\n \r\n    static final String ROUTE_ID_ASYNC_IN = getInRouteId(ServiceEnum.TRANSLATE, OPERATION_NAME);\r\n \r\n    static final String ROUTE_ID_ASYNC_OUT = getOutRouteId(ServiceEnum.TRANSLATE, OPERATION_NAME);\r\n \r\n    static final String URI_ASYNC_OUT = \"direct:\" + ROUTE_ID_ASYNC_OUT;\r\n \r\n    @Override\r\n    protected void doConfigure() throws Exception {\r\n        \/\/ asyncTranslate - input asynch message\r\n        createAsyncRouteIn();\r\n \r\n        \/\/ asyncTranslate - process delivery (=asynchronous execution)\r\n        createAsyncRouteOut();\r\n    }\r\n \r\n    \/**\r\n     * Route for asynchronous &lt;strong&gt;asyncTranslate&lt;\/strong&gt; input operation.\r\n     * &lt;p\/&gt;\r\n     * Prerequisite: none\r\n     * &lt;p\/&gt;\r\n     * Output: {@link AsyncTranslateResponse}\r\n     *\/\r\n    private void createAsyncRouteIn() {\r\n        Namespaces ns = new Namespaces(\"h\", TranslateWebServiceConfig.TRANSLATE_SERVICE_NS);\r\n \r\n        \/\/ note: mandatory parameters are set already in XSD, this validation is extra\r\n        XPathValidator validator = new XPathValidator(\"\/h:asyncTranslateRequest\", ns, \"h:inputText\");\r\n \r\n        AsynchRouteBuilder.newInstance(ServiceEnum.TRANSLATE, OPERATION_NAME,\r\n                getInWsUri(new QName(TranslateWebServiceConfig.TRANSLATE_SERVICE_NS, \"asyncTranslateRequest\")),\r\n                new AsynchResponseProcessor() {\r\n                    @Override\r\n                    protected Object setCallbackResponse(CallbackResponse callbackResponse) {\r\n                        AsyncTranslateResponse res = new AsyncTranslateResponse();\r\n                        res.setConfirmAsyncTranslate(callbackResponse);\r\n                        return res;\r\n                    }\r\n                }, jaxb(AsyncTranslateResponse.class))\r\n \r\n                .withValidator(validator)\r\n                .build(this);\r\n    }\r\n \r\n    \/**\r\n     * Route for &lt;strong&gt;asyncTranslate&lt;\/strong&gt; operation - process delivery (=asynchronous execution).\r\n     * Only input text is logged in this case.\r\n     * &lt;p\/&gt;\r\n     * Prerequisite: none\r\n     *\/\r\n    private void createAsyncRouteOut() {\r\n        final String URI_LOG_INPUT_PARAMS = \"direct:logInputParams\";\r\n \r\n        from(URI_ASYNC_OUT)\r\n                .routeId(ROUTE_ID_ASYNC_OUT)\r\n \r\n                \/\/ xml -&gt; AsyncTranslateRequest\r\n                .unmarshal(jaxb(AsyncTranslateRequest.class))\r\n \r\n                .to(\"extcall:message:\" + URI_LOG_INPUT_PARAMS);\r\n \r\n \r\n        from(URI_LOG_INPUT_PARAMS)\r\n                .validate(body().isInstanceOf(AsyncTranslateRequest.class))\r\n                .log(LoggingLevel.DEBUG, \"Asynchronous execution - input text '${body.inputText}' (lang: ${body.inputLang})\");\r\n    }\r\n}\r\n<\/pre>\n<p><code>RouteIn<\/code> uses\u00a0<code>AsynchRouteBuilder <\/code>for easy configuration\u00a0with the following features:<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<ul>\n<li>defines which incoming Web Service request should start this route<\/li>\n<li>defines confirmation response for the source system.\u00a0When input route is successfully executed, synchronous response to the source system is returned.<\/li>\n<li>defines validator that checks if there is element <em>inputText<\/em> in the incoming request<\/li>\n<\/ul>\n<p><code>RouteOut<\/code> defines asynchronous process itself. Input request (<code>AsyncTranslateRequest<\/code>) is only logged in this case.<\/p>\n<p>And that&#8217;s all. Everything around is implemented by OpenHub framework.<\/p>\n<h2 id=\"AsynchronousprocessingwithOpenHub-Externalcalls\">External calls<\/h2>\n<p>Your route implementations will often call external systems or another routes. If you implement asynchronous process then you have to adhere to the rules of idempotency &#8211; every part of your process can be called more than once and you have to ensure identical behaviour in all calls. Sometimes external system\/route is\u00a0idempotent by itself and then you can call it as many times as you want. If not then you have to control it in your implementation. Therefore we have made the Camel component <em><a class=\"external-link\" href=\"https:\/\/openhubframework.atlassian.net\/wiki\/spaces\/OHF\/pages\/33658\/extcall\" rel=\"nofollow\">extcall<\/a><\/em>.<\/p>\n<p>Component <code>excall<\/code>in the above example ensures that route with\u00a0<code>URI_LOG_INPUT_PARAMS<\/code> will be called exactly once, even if the whole asynchrounous process runs more times.<\/p>\n<p><figure id=\"attachment_69713\" aria-describedby=\"caption-attachment-69713\" style=\"width: 860px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/10\/ext_call.png\"><img decoding=\"async\" class=\"wp-image-69713 size-full\" title=\"External call explaination\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/10\/ext_call.png\" alt=\"External call explaination\" width=\"860\" height=\"615\" srcset=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/10\/ext_call.png 860w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/10\/ext_call-300x215.png 300w, https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2017\/10\/ext_call-768x549.png 768w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><figcaption id=\"caption-attachment-69713\" class=\"wp-caption-text\">External call explaination<\/figcaption><\/figure><\/p>\n<p>Description:<\/p>\n<ul>\n<li>two external systems are called during asynchronous message processing<\/li>\n<li>there are two extcall&#8217;s stops to which we can return during processing\n<ul>\n<li>if error occurs\u00a0before first request to external system 1 then next processing attempt will start from the beginning, same as new message arrives<\/li>\n<li>during communication with external system 2 then next processing attempt will start from extcall1<\/li>\n<li>after successful response from\u00a0external system 2 then next\u00a0processing attempt will start from\u00a0extcall2<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 id=\"AsynchronousprocessingwithOpenHub-Funnelandthrottlingcomponents\">Funnel and throttling components<\/h2>\n<p>Other powerful components are\u00a0<a class=\"external-link\" href=\"https:\/\/openhubframework.atlassian.net\/wiki\/spaces\/OHF\/pages\/33654\/msg-funnel\" rel=\"nofollow\"><code>funnel<\/code><\/a> and <a class=\"external-link\" href=\"https:\/\/openhubframework.atlassian.net\/wiki\/spaces\/OHF\/pages\/33653\/throttling\" rel=\"nofollow\"><code>throttling<\/code><\/a>.<\/p>\n<p><code>Funnel<\/code> component is for filtering concurrent messages at specific integration point. This filtering ensures that only one message of specific type or with specific information at one moment will be processed in that place, even in guaranteed order (optional choice). It can be useful for communication with external systems which can accept only one input message for specific entity (e.g. one specific customer in ordering system) at one time.<\/p>\n<p>Second component <code>throttling<\/code>\u00a0allows you to ensure that a specific endpoint does not get overloaded, or that we don&#8217;t exceed an agreed SLA with any external service. <code>Throttling<\/code> component can also be used for synchronous messages.<\/p>\n<p>All components support cluster.<\/p>\n<h2 id=\"AsynchronousprocessingwithOpenHub-Implementationdetails\">Implementation details<\/h2>\n<p>Everything that OpenHub needs to save is saved in a database &#8211; there are no limitations on the type. There is no need to adapt a JMS\/MQ system to support asynchronous messaging. Then you can use any tools you like for your daily work &#8211; <a class=\"external-link\" href=\"https:\/\/openhubframework.atlassian.net\/wiki\/spaces\/OHF\/pages\/33594\/Data+model\" rel=\"nofollow\">data model<\/a> is simple, clear and well documented. There are many more database tools than for JMS\/MQ systems.<\/p>\n<p>Sometimes we hear that it&#8217;s anti-pattern to use database for this case, it can be\u00a0a bottleneck in some cases from a performance point of view. It depends on integration use cases from real projects but we haven&#8217;t still tought performance limits in our real projects where hundreds of thousands concurrent requests are processed. We are prepared to add JMS\/MQ implementation but it hasn&#8217;t been needed so far.<\/p>\n<p>It&#8217;s not necessary to start asynchronous process only by incoming request &#8211; you can also use\u00a0<a class=\"external-link\" href=\"https:\/\/openhubframework.atlassian.net\/wiki\/spaces\/OHF\/pages\/11110778\/Scheduled+jobs\" rel=\"nofollow\">scheduling jobs<\/a>\u00a0to start route at any time you need and then leave it to OpenHub framework.<\/p>\n<p>All examples can be found in reference implementation at GitHub &#8211; see\u00a0<a class=\"external-link\" href=\"https:\/\/github.com\/OpenWiseSolutions\/openhub-ri\" rel=\"nofollow\">https:\/\/github.com\/OpenWiseSolutions\/openhub-ri<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>We introduced OpenHub framework in the previous part of this series. This part shows one of the most powerful feature of the framework &#8211;\u00a0asynchronous messaging model. Asynchronous communication between systems is used when source system can&#8217;t wait for the response of the target system. There are several reasons: source system must be responsive as much &hellip;<\/p>\n","protected":false},"author":4638,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[357,119,1201,680],"class_list":["post-69712","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-apache-camel","tag-architecture","tag-enterprise-java","tag-integration-patterns"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Asynchronous communication made by OpenHub framework - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Article shows one of the most powerful feature of the framework - asynchronous messaging model.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Asynchronous communication made by OpenHub framework - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Article shows one of the most powerful feature of the framework - asynchronous messaging model.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-10-17T13:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Petr Juza\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@pjuza\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Petr Juza\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html\"},\"author\":{\"name\":\"Petr Juza\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/dc31ceadb3725979f81122ca1d1b2f3a\"},\"headline\":\"Asynchronous communication made by OpenHub framework\",\"datePublished\":\"2017-10-17T13:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html\"},\"wordCount\":1009,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"Apache Camel\",\"Architecture\",\"Enterprise Java\",\"Integration Patterns\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html\",\"name\":\"Asynchronous communication made by OpenHub framework - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2017-10-17T13:00:00+00:00\",\"description\":\"Article shows one of the most powerful feature of the framework - asynchronous messaging model.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2017\\\/10\\\/asynchronous-communication-made-openhub-framework.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Asynchronous communication made by OpenHub framework\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/dc31ceadb3725979f81122ca1d1b2f3a\",\"name\":\"Petr Juza\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f3af4b50b3ab5f895d0634ffe197b112710a692bfe0f1b6397c4bd2b5dba228?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f3af4b50b3ab5f895d0634ffe197b112710a692bfe0f1b6397c4bd2b5dba228?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f3af4b50b3ab5f895d0634ffe197b112710a692bfe0f1b6397c4bd2b5dba228?s=96&d=mm&r=g\",\"caption\":\"Petr Juza\"},\"description\":\"Over 12 years of proven experience in Java and integration development. He's part of group of experienced profesionals in OpenWise Solution company focusing on making products and software for customers. He's Java and integration enthusiast. He's co-organizer of many developer meetups at Czech republic. He has been writing popular Java blog for several years.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/petrjuza\\\/ \",\"https:\\\/\\\/x.com\\\/pjuza\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/petr-juza\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Asynchronous communication made by OpenHub framework - Java Code Geeks","description":"Article shows one of the most powerful feature of the framework - asynchronous messaging model.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html","og_locale":"en_US","og_type":"article","og_title":"Asynchronous communication made by OpenHub framework - Java Code Geeks","og_description":"Article shows one of the most powerful feature of the framework - asynchronous messaging model.","og_url":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2017-10-17T13:00:00+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Petr Juza","twitter_card":"summary_large_image","twitter_creator":"@pjuza","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Petr Juza","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html"},"author":{"name":"Petr Juza","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/dc31ceadb3725979f81122ca1d1b2f3a"},"headline":"Asynchronous communication made by OpenHub framework","datePublished":"2017-10-17T13:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html"},"wordCount":1009,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["Apache Camel","Architecture","Enterprise Java","Integration Patterns"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html","url":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html","name":"Asynchronous communication made by OpenHub framework - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2017-10-17T13:00:00+00:00","description":"Article shows one of the most powerful feature of the framework - asynchronous messaging model.","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2017\/10\/asynchronous-communication-made-openhub-framework.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Asynchronous communication made by OpenHub framework"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/dc31ceadb3725979f81122ca1d1b2f3a","name":"Petr Juza","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7f3af4b50b3ab5f895d0634ffe197b112710a692bfe0f1b6397c4bd2b5dba228?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7f3af4b50b3ab5f895d0634ffe197b112710a692bfe0f1b6397c4bd2b5dba228?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7f3af4b50b3ab5f895d0634ffe197b112710a692bfe0f1b6397c4bd2b5dba228?s=96&d=mm&r=g","caption":"Petr Juza"},"description":"Over 12 years of proven experience in Java and integration development. He's part of group of experienced profesionals in OpenWise Solution company focusing on making products and software for customers. He's Java and integration enthusiast. He's co-organizer of many developer meetups at Czech republic. He has been writing popular Java blog for several years.","sameAs":["https:\/\/www.linkedin.com\/in\/petrjuza\/ ","https:\/\/x.com\/pjuza"],"url":"https:\/\/www.javacodegeeks.com\/author\/petr-juza"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/69712","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/4638"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=69712"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/69712\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=69712"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=69712"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=69712"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}