{"id":1263,"date":"2012-05-15T01:00:00","date_gmt":"2012-05-15T01:00:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/apache-camel-tutorial-introduction-to-eip-routes-components-testing-and-other-concepts.html"},"modified":"2012-10-22T05:12:22","modified_gmt":"2012-10-22T05:12:22","slug":"apache-camel-tutorial-introduction-to","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html","title":{"rendered":"Apache Camel Tutorial &#8211; Introduction to EIP, Routes, Components, Testing and other Concepts"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different technologies, protocols and data formats. Nevertheless, the integration of these applications shall be modeled in a standardized way, realized efficiently and supported by automatic tests. Such a standard exists with the Enterprise Integration Patterns (EIP) [1], which have become the industry standard for describing, documenting and implementing integration problems. Apache Camel [2] implements the EIPs and offers a standardized, internal domain-specific language (DSL) [3] to integrate applications. This article gives an introduction to Apache Camel including several code examples. <\/p>\n<p><strong>Enterprise Integration Patterns<\/strong>  <\/p>\n<p>EIPs can be used to split integration problems into smaller pieces and model them using standardized graphics. Everybody can understand these models easily. Besides, there is no need to reinvent the wheel every time for each integration problem.   <\/p>\n<p>Using EIPs, Apache Camel closes a gap between modeling and implementation. There is almost a one-to-one relation between EIP models and the DSL of Apache Camel. This article explains the relation of EIPs and Apache Camel using an online shop example.   <\/p>\n<p><strong>Use Case: Handling Orders in an Online Shop<\/strong>  <\/p>\n<p>The main concepts of Apache Camel are introduced by implementing a small use case. Starting your own project should be really easy after reading this article. The easiest way to get started is using a Maven archetype [4]. This way, you can rebuild the following example within minutes. Of course, you can also download the whole example at once[5].   <\/p>\n<p>Figure 1 shows the example from EIP perspective. The task is to process orders of an online shop. Orders arrive in csv format. At first, the orders have to be transformed to the internal format. Order items of each order must be split because the shop only sells dvds and cds. Other order items are forwarded to a partner.<br \/>\n&nbsp;  <\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/1.bp.blogspot.com\/-OHNdhAlXUn8\/T7FIyeZ6eFI\/AAAAAAAAAYI\/fG74FalgU20\/s1600\/Camel_Use_Case.png\"><img decoding=\"async\" border=\"0\" height=\"151\" src=\"http:\/\/1.bp.blogspot.com\/-OHNdhAlXUn8\/T7FIyeZ6eFI\/AAAAAAAAAYI\/fG74FalgU20\/s400\/Camel_Use_Case.png\" width=\"400\" \/><\/a><\/div>\n<p><strong>Figure <\/strong><strong>1<\/strong><strong>: EIP Perspective of the Integration Problem<\/strong>   <\/p>\n<p>This example shows the advantages of EIPs:  The integration problem is split into several small, perseverative subproblems. These subproblems are easy to understand and solved the same way each time. After describing the use case, we will now look at the basic concepts of Apache Camel.   <\/p>\n<p><strong>Basic Concepts<\/strong>  <\/p>\n<p>Apache Camel runs on the Java Virtual Machine (JVM). Most components are realized in Java. Though, this is no requirement for new components. For instance, the camel-scala component is written in Scala. The Spring framework is used in some parts, e.g. for transaction support. However, Spring dependencies were reduced to a minimum in release 2.9 [6]. The core of Apache Camel is very small and just contains commonly used components (i.e. connectors to several technologies and APIs) such as Log, File, Mock or Timer.   <\/p>\n<p>Further components can be added easily due to the modular structure of Apache Camel., Maven is recommended for dependency management, because most technologies require additional libraries. Though, libraries can also be downloaded manually and added to the classpath, of course.   <\/p>\n<p>The core functionality of Apache Camel is its routing engine. It allocates messages based on the related routes. A route contains flow and integration logic. It is implemented using EIPs and a specific DSL. Each message contains a body, several headers and optional attachments. The messages are sent from a provider to a consumer. In between, the messages may be processed, e.g. filtered or transformed. Figure 1 shows how the messages can change within a route.   <\/p>\n<p>Messages between a provider and a consumer are managed by a message exchange container, which contains an unique message id, exception information, incoming and outgoing messages (i.e. request and response), and the used message exchange pattern (MEP). \u201eIn Only\u201c MEP is used for one-way messages such as JMS whereas \u201eIn Out\u201c MEP executes request-response communication such as a client side HTTP based request and its response from the server side.   <\/p>\n<p>After shortly explaining the basic concepts of Apache Camel, the following sections will give more details and code examples. Let\u2019s begin with the architecture of Apache Camel.   <\/p>\n<p><strong>Architecture<\/strong>  <\/p>\n<p>Figure 2 shows the architecture of Apache Camel. A CamelContext provides the runtime system. Inside, processors handle things in between endpoints like routing or transformation. Endpoints connect several technologies to be integrated. Apache Camel offers different DSLs to realize the integration problems.   <\/p>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/1.bp.blogspot.com\/-U9_aIig9iz8\/T7FI8ZVo4FI\/AAAAAAAAAYQ\/9vq39pOZLHE\/s1600\/Camel_Architecture.png\"><img decoding=\"async\" border=\"0\" height=\"250\" src=\"http:\/\/1.bp.blogspot.com\/-U9_aIig9iz8\/T7FI8ZVo4FI\/AAAAAAAAAYQ\/9vq39pOZLHE\/s400\/Camel_Architecture.png\" width=\"400\" \/><\/a><\/div>\n<p><strong>Figure <\/strong><strong>2<\/strong><strong>: Architecture of Apache Camel<\/strong>  <\/p>\n<p><strong>CamelContext<\/strong>  <\/p>\n<p>The CamelContext is the runtime system of Apache Camel and connects its different concepts such as routes, components or endpoints. The following code snipped shows a Java main method, which starts the CamelContext and stops it after 30 seconds. Usually, the CamelContext is started when loading the application and stopped at shutdown.   <\/p>\n<pre class=\"brush:java\">public class CamelStarter {\r\n\r\npublic static void main(String[] args) throws Exception {\r\n \r\n   CamelContext context = new DefaultCamelContext();\r\n\r\n   context.addRoutes(new IntegrationRoute());\r\n \r\n   context.start();\r\n\r\n   Thread.sleep(30000);\r\n\r\n   context.stop();\r\n\r\n   }\r\n\r\n}\r\n \r\n<\/pre>\n<p>The runtime system can be included anywhere in the JVM environment, including web container (e.g. Tomcat), JEE application server (e.g. IBM WebSphere AS), OSGi container, or even in the cloud.   <\/p>\n<p><strong>Domain Specific Languages<\/strong>  <\/p>\n<p>DSLs facilitate the realization of complex projects by using a higher abstraction level. Apache Camel offers several different DSLs. Java, Groovy and Scala use object-oriented concepts and offer a specific method for most EIPs. On the other side, Spring XML DSL is based on the Spring framework and uses XML configuration. Besides, OSGi blueprint XML is available for OSGi integration.   <\/p>\n<p>Java DSL has best IDE support. Groovy and Scala DSL are similar to Java DSL, in addition they offer typical features of modern JVM languages such as concise code or closures. Contrary to these programming languages, Spring XML DSL requires a lot of XML. Besides, it offers very powerful Spring-based dependency injection mechanism and nice abstractions to simplify configurations (such as JDBC or JMS connections). The choice is purely a matter of taste in most use cases. Even a combination is possible. Many developer use Spring XML for configuration whilst routes are realized in Java, Groovy or Scala.   <strong>Routes<\/strong>  <\/p>\n<p>Routes are a crucial part of Apache Camel. The flow and logic of an integration is specified here. The following example shows a route using Java DSL:   <div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">public class IntegrationRoute extends RouteBuilder {\r\n\r\n@Override\r\n \r\n\r\npublic void configure() throws Exception {\r\n \r\n\r\nfrom(\u201cfile:target\/inbox\u201d)\r\n \r\n\r\n                      .process(new LoggingProcessor())\r\n \r\n\r\n\r\n                      .bean(new TransformationBean(), \r\n\r\n\r\n                                  \u201cmakeUpperCase\u201d)                                             \r\n \r\n\r\n\r\n.to(\u201cfile:target\/outbox\/dvd\u201d);\r\n \r\n}\r\n\r\n}\r\n \r\n<\/pre>\n<p>The DSL is easy to use. Everybody should be able to understand the above example without even knowing Apache Camel. The route realizes a part of the described use case. Orders are put in a file directory from an external source. The orders are processed and finally moved to the target directory.   <\/p>\n<p>Routes have to extend the \u201eRouteBuilder\u201c class and override the \u201econfigure\u201c method. The route itself begins with a \u201efrom\u201c endpoint and finishes at one or more \u201eto\u201c endpoints. In between, all necessary process logic is implemented. Any number of routes can be implemented within one \u201econfigure\u201c method.   <\/p>\n<p>The following snippet shows the same route realized via Spring XML DSL:  <\/p>\n<pre class=\"brush:java\">&lt;beans \u2026 &gt;\r\n \r\n&lt;bean class=\u201dmwea.TransformationBean\u201d id=\u201dtransformationBean\u201d\/&gt;\r\n \r\n&lt;bean class=\u201dmwea.LoggingProcessor\u201d id=\u201dloggingProcessor\u201d\/&gt;\r\n \r\n\r\n&lt;camelContext xmlns=\u201dhttp:\/\/camel.apache.org\/schema\/spring\u201d&gt;\r\n \r\n&lt;package&gt;mwea&lt;\/package&gt;\r\n \r\n&lt;route&gt;\r\n \r\n        &lt;from uri=\u201dfile:target\/inbox\u201d\/&gt;\r\n \r\n\r\n\r\n                    &lt;process ref=\u201dloggingProcessor\u201d\/&gt; \r\n\r\n\r\n                    &lt;bean ref=\u201dtransformationBean\u201d\/&gt;\r\n \r\n\r\n\r\n        &lt;to uri=\u201dfile:target\/outbox\u201d\/&gt;\r\n \r\n   &lt;\/route&gt;\r\n \r\n&lt;\/camelContext&gt;\r\n \r\n&lt;\/beans&gt;\r\n <\/pre>\n<p>Besides routes, another important concept of Apache Camel is its components. They offer integration points for almost every technology.   <\/p>\n<p><strong>Components<\/strong>  <\/p>\n<p>In the meantime, over 100 components are available. Besides widespread technologies such as HTTP, FTP, JMS or JDBC, many more technologies are supported, including cloud services from Amazon, Google, GoGrid, and others. New components are added in each release. Often, also the community builds new custom components because it is very easy.   <\/p>\n<p>The most amazing feature of Apache Camel is its uniformity. All components use the same syntax and concepts. Every integration and even its automatic unit tests look the same. Thus, complexity is reduced a lot. Consider changing the above example: If orders should be sent to a JMS queue instead of a file directory, just change the \u201eto\u201c endpoint from \u201efile:target\/outbox\u201c to \u201ejms:queue:orders\u201c. That\u2019s it! (JMS must be configured once within the application before, of course)   <\/p>\n<p>While components offer the interface to technologies, Processors and Beans can be used to add custom integration logic to a route.   <\/p>\n<p><strong>Processors and Beans<\/strong>  <\/p>\n<p>Besides using EIPs, you have to add individual integration logic, often. This is very easy and again uses the same concepts always: Processors or Beans. Both were used in the route example above.   <\/p>\n<p>Processor is a simple Java interface with one single method: \u201eprocess\u201c. Inside this method, you can do whatever you need to solve your integration problem, e.g. transform the incoming message, call other services, and so on.  <\/p>\n<pre class=\"brush:java\">public class LoggingProcessor implements Processor {\r\n \r\n@Override\r\n \r\npublic void process(Exchange exchange) throws Exception {\r\n \r\nSystem.<em>out<\/em>.println(\u201cReceived Order: \u201d +\r\n \r\nexchange.getIn().getBody(String.class));\r\n \r\n}\r\n \r\n}\r\n <\/pre>\n<p>The \u201eexchange\u201c parameter contains the Messsage Exchange with the incoming message, the outgoing message, and other information. Due to implementing the Processor interface, you have got a dependency to the Camel API. This might be a problem sometimes. Maybe you already have got existing integration code which cannot be changed (i.e. you cannot implement the Processor interface)? In this case, you can use Beans, also called POJOs (Plain Old Java Object). You get the incoming message (which is the parameter of the method) and return an outgoing message, as shown in the following snipped:   <\/p>\n<pre class=\"brush:java\">public class TransformationBean {\r\n \r\n\r\npublic String makeUpperCase(String body) {\r\n \r\n\r\nString transformedBody = body.toUpperCase();\r\n\r\nreturn transformedBody;\r\n}\r\n \r\n}\r\n \r\n<\/pre>\n<p>The above bean receives a String, transforms it, and finally sends it to the next endpoint. Look at the route above again. The incoming message is a File. You may wonder why this works? Apache Camel offers another powerful feature: More than 150 automatic type converters are included from scratch, e.g. FileToString, CollectionToObject[] or URLtoInputStream. By the way: Further type converters can be created and added to the CamelContext easily [7].   <\/p>\n<p>If a Bean only contains one single method, it even can be omitted in the route. The above call therefore could also be .bean(new TransformationBean()) instead of .bean(new TransformationBean(), \u201cmakeUpperCase\u201d).   <\/p>\n<p><strong>Adding some more Enterprise Integration Patterns<\/strong>  <\/p>\n<p>The above route transforms incoming orders using the Translator EIP before processing them. Besides this transformation, some more work is required to realize the whole use case. Therefore, some more EIPs are used in the following example:  <\/p>\n<pre class=\"brush:java\">public class IntegrationRoute extends RouteBuilder {\r\n \r\n@Override\r\n \r\npublic void configure() throws Exception {\r\n \r\nfrom(\u201cfile:target\/inbox\u201d)\r\n\r\n.process(new LoggingProcessor())\r\n \r\n.bean(new TransformationBean())\r\n\r\n.unmarshal().csv()\r\n \r\n.split(body().tokenize(\u201c,\u201d))\r\n \r\n.choice()\r\n \r\n.when(body().contains(\u201cDVD\u201d))\r\n \r\n.to(\u201cfile:target\/outbox\/dvd\u201d)\r\n \r\n.when(body().contains(\u201cCD\u201d))\r\n \r\n.to(\u201cactivemq:CD_Orders\u201d)\r\n \r\n.otherwise()\r\n\r\n.to(\u201cmock:others\u201d);\r\n \r\n\r\n}\r\n\r\n}\r\n<\/pre>\n<p>Each csv file illustrates one single order containing one or more order items. The camel-csv component is used to convert the csv message. Afterwards, the Splitter EIP separates each order item of the message body. In this case, the default separator (a comma) is used. Though, complex regular expressions or scripting languages such as XPath, XQuery or SQL can also be used as splitter.   <\/p>\n<p>Each order item has to be sent to a specific processing unit (remember: there are dvd orders, cd orders, and other orders which are sent to a partner). The content-based router EIP solves this problem without any individual coding efforts. Dvd orders are processed via a file directory whilst cd orders are sent to a JMS queue.   <\/p>\n<p>ActiveMQ is used as JMS implementation in this example. To add ActiveMQ support to a Camel application, you only have to add the related maven dependency for the camel-activemq component or add the JARs to the classpath manually. That\u2019s it. Some other components need a little bit more configuration, once. For instance, if you want to use WebSphere MQ or another JMS implementation instead of ActiveMQ, you have to configure the JMS provider.   <\/p>\n<p>All other order items besides dvds and cds are sent to a partner. Unfortunately, this interface is not available, yet. The Mock component is used instead to simulate this interface momentarily.   <\/p>\n<p>The above example shows impressively how different interfaces (in this case File, JMS, and Mock) can be used within one route. You always apply the same syntax and concepts despite very different technologies.   <\/p>\n<p><strong>Automatic Unit and Integration Tests<\/strong>  <\/p>\n<p>Automatic tests are crucial. Nevertheless, it usually is neglected in integration projects. The reason is too much efforts and very high complexity due to several different technologies.   <\/p>\n<p>Apache Camel solves this problem: It offers test support via JUnit extensions. The test class must extend CamelTestSupport to use Camel\u2019s powerful testing capabilities. Besides additional assertions, mocks are supported implicitly. No other mock framework such as EasyMock or Mockito is required. You can even simulate sending messages to a route or receiving messages from it via a producer respectively consumer template. All routes can be tested automatically using this test kit. It is noteworthy to mention that the syntax and concepts are the same for every technology, again.   <\/p>\n<p>The following code snipped shows a unit test for our example route:   <\/p>\n<pre class=\"brush:java\">public class IntegrationTest extends CamelTestSupport {\r\n \r\n\r\n@Before\r\n \r\n\r\npublic void setup() throws Exception {\r\n \r\n\r\nsuper.setUp();\r\n \r\ncontext.addRoutes(new IntegrationRoute());\r\n \r\n\r\n}\r\n \r\n\r\n@Test\r\n \r\n\r\npublic void testIntegrationRoute() throws Exception {\r\n \r\n\/\/ Body of test message containing several order items\r\n \r\n\r\nString bodyOfMessage = \u201cHarry Potter \/ dvd, Metallica \/ cd, Claus Ibsen \u2013\r\n \r\n\r\nCamel in Action \/ book \u201c;\r\n\r\n\/\/ Initialize the mock and set expected results\r\n \r\nMockEndpoint mock = context.getEndpoint(\u201cmock:others\u201d,\r\n \r\nMockEndpoint.class);\r\n \r\nmock.expectedMessageCount(1);\r\n\r\nmock.setResultWaitTime(1000);\r\n\r\n\/\/ Only the book order item is sent to the mock\r\n\r\n\/\/ (because it is not a cd or dvd)\r\n \r\n\r\nString bookBody = \u201cClaus Ibsen \u2013 Camel in Action \/ book\u201d.toUpperCase();\r\n\r\nmock.expectedBodiesReceived(bookBody);\r\n \r\n\r\n\/\/ ProducerTemplate sends a message (i.e. a File) to the inbox directory\r\n \r\n\r\ntemplate.sendBodyAndHeader(\u201cfile:\/\/target\/inbox\u201d, bodyOfMessage, Exchange.<em>FILE_NAME<\/em>, \u201corder.csv\u201d);\r\n \r\n\r\nThread.sleep(3000);\r\n \r\n\/\/ Was the file moved to the outbox directory?\r\n\r\nFile target = new File(\u201ctarget\/outbox\/dvd\/order.csv\u201d);\r\n\r\nassertTrue(\u201cFile not moved!\u201d, target.exists());\r\n\r\n\/\/ Was the file transformed correctly (i.e. to uppercase)?\r\n \r\n\r\nString content = context.getTypeConverter().convertTo(String.class, target);\r\n\r\nString dvdbody = \u201cHarry Potter \/ dvd\u201d.toUpperCase();\r\n \r\nassertEquals(dvdbody, content);\r\n \r\n\/\/ Was the book order (i.e. \u201eCamel in action\u201c which is not a cd or dvd) sent to the mock?\r\n\r\nmock.assertIsSatisfied();\r\n \r\n}\r\n \r\n\r\n}\r\n<\/pre>\n<p>The setup method creates an instance of CamelContext (and does some additional stuff). Afterwards, the route is added such that it can be tested. The test itself creates a mock and sets its expectations. Then, the producer template sends a message to the \u201efrom\u201c endpoint of the route. Finally, some assertions validate the results. The test can be run the same way as each other JUnit test: directly within the IDE or inside a build script. Even agile Test-driven Development (TDD) is possible. At first, the Camel test has to be written, before implementing the corresponding route.   <\/p>\n<p>If you want to learn more about Apache Camel, the first address should be the book \u201eCamel in Action\u201c [8], which describes all basics and many advanced features in detail including working code examples for each chapter. After whetting your appetite, let\u2019s now discuss when to use Apache Camel\u2026   <\/p>\n<p><strong>Alternatives for Systems Integration<\/strong>  <\/p>\n<p>Figure 3 shows three alternatives for integrating applications:   <\/p>\n<ul>\n<li><strong>Own custom Solution<\/strong>: Implement an individual solution that works for your problem without separating problems into little pieces. This works and is probably the fastest alternative for small use cases. You have to code all by yourself.<\/li>\n<\/ul>\n<ul>\n<li><strong>Integration Framework<\/strong>: Use a framework, which helps to integrate applications in a standardized way using several integration patterns. It reduces efforts a lot. Every developer will easily understand what you did. You do not have to reinvent the wheel each time.<\/li>\n<\/ul>\n<ul>\n<li><strong>Enterprise Service Bus (ESB)<\/strong>: Use an ESB to integrate your applications. Under the hood, the ESB often also uses an integration framework. But there is much more functionality, such as business process management, a registry or business activity monitoring. You can usually configure routing and such stuff within a graphical user interface (you have to decide at your own if that reduces complexity and efforts). Usually, an ESB is a complex product. The learning curve is much higher than using a lightweight integration framework. Though, therefore you get a very powerful tool, which should fulfill all your requirements in large integration projects.<\/li>\n<\/ul>\n<div class=\"separator\" style=\"clear: both;text-align: center\"><a href=\"http:\/\/2.bp.blogspot.com\/-PFBBd6nC4vc\/T7FJPuz59TI\/AAAAAAAAAYY\/OgnSSEO3VI4\/s1600\/Camel_Alternatives.png\"><img decoding=\"async\" border=\"0\" height=\"126\" src=\"http:\/\/2.bp.blogspot.com\/-PFBBd6nC4vc\/T7FJPuz59TI\/AAAAAAAAAYY\/OgnSSEO3VI4\/s400\/Camel_Alternatives.png\" width=\"400\" \/><\/a><\/div>\n<p>If you decide to use an integration framework, you still have three good alternatives in the JVM environment: Spring Integration [9], Mule [10], and Apache Camel. They are all lightweight, easy to use and implement the EIPs.  Therefore, they offer a standardized way to integrate applications and can be used even in very complex integration projects. A more detailed comparison of these three integration frameworks can be found at [11].   <\/p>\n<p>My personal favorite is Apache Camel due to its awesome Java, Groovy and Scala DSLs, combined with many supported technologies. Spring Integration and Mule only offer XML configuration. I would only use Mule if I need some of its awesome unique connectors to proprietary products (such as SAP, Tibco Rendevous, Oracle Siebel CRM, Paypal or IBM\u2019s CICS Transaction Gateway). I would only use Spring Integration in an existing Spring project and if I only need to integrate widespread technologies such as FTP, HTTP or JMS. In all other cases, I would use Apache Camel.   <\/p>\n<p>Nevertheless: No matter which of these lightweight integration frameworks you choose, you will have much fun realizing complex integration projects easily with low efforts. Remember: Often, a fat ESB has too much functionality, and therefore too much, unnecessary complexity and efforts. Use the right tool for the right job!   <\/p>\n<p><strong>Apache Camel is ready for Enterprise Integration Projects<\/strong>  <\/p>\n<p>Apache Camel already celebrated its fourth birthday in July 2011 [12] and represents a very mature and stable open source project. It supports all requirements to be used in enterprise projects, such as error handing, transactions, scalability, and monitoring. Commercial support is also available.   <\/p>\n<p>The most important gains is its available DSLs, many components for almost every thinkable technology, and the fact, that the same syntax and concepts can be used always \u2013 even for automatic tests \u2013 no matter which technologies have to be integrated. Therefore, Apache Camel should always be evaluated as lightweight alternative to heavyweight ESBs. Get started by downloading the example of this article. If you need any help or further information, there is a great community and a well-written book available. <\/p>\n<p><strong>Sources:<\/strong>  <\/p>\n<ul>\n<li>[1] \u201eEnterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions\u201c, ISBN: 0321200683, Gregor Hohpe, Bobby Woolf<\/li>\n<li>[2] Apache Camel <a href=\"http:\/\/camel.apache.org\/\">http:\/\/camel.apache.org<\/a><\/li>\n<li>[3] Internal DSL <a href=\"http:\/\/martinfowler.com\/bliki\/DomainSpecificLanguage.html\">http:\/\/martinfowler.com\/bliki\/DomainSpecificLanguage.html<\/a><\/li>\n<li>[4] Camel Archetypes <a href=\"http:\/\/camel.apache.org\/camel-maven-archetypes.html\">http:\/\/camel.apache.org\/camel-maven-archetypes.html<\/a><\/li>\n<li>[5] Example Code for this Article at github <a href=\"https:\/\/github.com\/megachucky\/camel-infoq\">https:\/\/github.com\/megachucky\/camel-infoq<\/a><\/li>\n<li>[6] Reduced Dependency on Spring JARs <a href=\"http:\/\/davsclaus.blogspot.com\/2011\/08\/apache-camel-29-reduced-dependency-on.html\">http:\/\/davsclaus.blogspot.com\/2011\/08\/apache-camel-29-reduced-dependency-on.html<\/a><\/li>\n<li>[7] Camel Type Converter <a href=\"http:\/\/camel.apache.org\/type-converter.html\">http:\/\/camel.apache.org\/type-converter.html<\/a><\/li>\n<li>[8] \u201cCamel in Action\u201d, ISBN: 1935182366, Claus Ibsen, Jonathan Anstey, Hadrian Zbarcea<\/li>\n<li>[9] Spring Integration <a href=\"http:\/\/www.springsource.org\/spring-integration\">www.springsource.org\/spring-integration<\/a><\/li>\n<li>[10] Mule ESB <a href=\"http:\/\/www.mulesoft.org\/\">http:\/\/www.mulesoft.org<\/a><\/li>\n<li>[11] Comparison of Apache Camel, Mule ESB and Spring Integration <a href=\"http:\/\/www.blogger.com\/2012\/01\/10\/spoilt-for-choice-which-integration-framework-to-use-spring-integration-mule-esb-or-apache-camel\">http:\/\/www.kai-waehner.de\/blog\/2012\/01\/10\/spoilt-for-choice-which-integration-framework-to-use-spring-integration-mule-esb-or-apache-camel<\/a><\/li>\n<li>[12] Fourth Birthday of Apache Camel <a href=\"http:\/\/camel.apache.org\/2011\/07\/07\/happy-birthday-camel.html\">http:\/\/camel.apache.org\/2011\/07\/07\/happy-birthday-camel.html<\/a><\/li>\n<\/ul>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/www.kai-waehner.de\/blog\/2012\/05\/04\/apache-camel-tutorial-introduction\/\">Apache Camel Tutorial \u2013 Introduction to EIP, Routes, Components, Testing, and other Concepts<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Kai Wahner at the <a href=\"http:\/\/www.kai-waehner.de\/blog\/\">Blog about Java EE \/ SOA \/ Cloud Computing<\/a> blog.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different technologies, protocols and data formats. Nevertheless, the integration of these applications shall be modeled in a standardized way, realized efficiently and supported by automatic tests. Such a standard exists with the Enterprise Integration Patterns &hellip;<\/p>\n","protected":false},"author":352,"featured_media":52,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[357,500],"class_list":["post-1263","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-apache-camel","tag-eip"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Apache Camel Tutorial - Introduction to EIP, Routes, Components, Testing and other Concepts - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different\" \/>\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\/2012\/05\/apache-camel-tutorial-introduction-to.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apache Camel Tutorial - Introduction to EIP, Routes, Components, Testing and other Concepts - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.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=\"2012-05-15T01:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-22T05:12:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-camel-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=\"Kai Waehner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/KaiWaehner\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kai Waehner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html\"},\"author\":{\"name\":\"Kai Waehner\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/fa3672ebafa40cdf63cce37d0d3dcb0b\"},\"headline\":\"Apache Camel Tutorial &#8211; Introduction to EIP, Routes, Components, Testing and other Concepts\",\"datePublished\":\"2012-05-15T01:00:00+00:00\",\"dateModified\":\"2012-10-22T05:12:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html\"},\"wordCount\":2806,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-camel-logo.jpg\",\"keywords\":[\"Apache Camel\",\"EIP\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html\",\"name\":\"Apache Camel Tutorial - Introduction to EIP, Routes, Components, Testing and other Concepts - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-camel-logo.jpg\",\"datePublished\":\"2012-05-15T01:00:00+00:00\",\"dateModified\":\"2012-10-22T05:12:22+00:00\",\"description\":\"Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-camel-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-camel-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/05\\\/apache-camel-tutorial-introduction-to.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\":\"Apache Camel Tutorial &#8211; Introduction to EIP, Routes, Components, Testing and other Concepts\"}]},{\"@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\\\/fa3672ebafa40cdf63cce37d0d3dcb0b\",\"name\":\"Kai Waehner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea843f22cad305dd5e2f75e1afe58e9e61145c1a1f835606af7182dcb197da47?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea843f22cad305dd5e2f75e1afe58e9e61145c1a1f835606af7182dcb197da47?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea843f22cad305dd5e2f75e1afe58e9e61145c1a1f835606af7182dcb197da47?s=96&d=mm&r=g\",\"caption\":\"Kai Waehner\"},\"description\":\"Kai Waehner works as consultant. His main area of expertise lies within the fields of Java EE, SOA, Cloud Computing, BPM, Big Data, and Enterprise Architecture Management. He is speaker at international IT conferences such as JavaOne, ApacheCon or OOP, writes articles for professional journals, and shares his experiences with new technologies on his blog.\",\"sameAs\":[\"http:\\\/\\\/www.kai-waehner.de\\\/blog\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/profile\\\/view?id=121499132\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/KaiWaehner\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/kai-waehner\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Apache Camel Tutorial - Introduction to EIP, Routes, Components, Testing and other Concepts - Java Code Geeks","description":"Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different","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\/2012\/05\/apache-camel-tutorial-introduction-to.html","og_locale":"en_US","og_type":"article","og_title":"Apache Camel Tutorial - Introduction to EIP, Routes, Components, Testing and other Concepts - Java Code Geeks","og_description":"Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different","og_url":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-05-15T01:00:00+00:00","article_modified_time":"2012-10-22T05:12:22+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-camel-logo.jpg","type":"image\/jpeg"}],"author":"Kai Waehner","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/KaiWaehner","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Kai Waehner","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html"},"author":{"name":"Kai Waehner","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/fa3672ebafa40cdf63cce37d0d3dcb0b"},"headline":"Apache Camel Tutorial &#8211; Introduction to EIP, Routes, Components, Testing and other Concepts","datePublished":"2012-05-15T01:00:00+00:00","dateModified":"2012-10-22T05:12:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html"},"wordCount":2806,"commentCount":1,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-camel-logo.jpg","keywords":["Apache Camel","EIP"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html","url":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html","name":"Apache Camel Tutorial - Introduction to EIP, Routes, Components, Testing and other Concepts - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-camel-logo.jpg","datePublished":"2012-05-15T01:00:00+00:00","dateModified":"2012-10-22T05:12:22+00:00","description":"Data exchanges between companies increase a lot. The number of applications, which must be integrated increases, too. The interfaces use different","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-camel-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-camel-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/05\/apache-camel-tutorial-introduction-to.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":"Apache Camel Tutorial &#8211; Introduction to EIP, Routes, Components, Testing and other Concepts"}]},{"@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\/fa3672ebafa40cdf63cce37d0d3dcb0b","name":"Kai Waehner","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ea843f22cad305dd5e2f75e1afe58e9e61145c1a1f835606af7182dcb197da47?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ea843f22cad305dd5e2f75e1afe58e9e61145c1a1f835606af7182dcb197da47?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ea843f22cad305dd5e2f75e1afe58e9e61145c1a1f835606af7182dcb197da47?s=96&d=mm&r=g","caption":"Kai Waehner"},"description":"Kai Waehner works as consultant. His main area of expertise lies within the fields of Java EE, SOA, Cloud Computing, BPM, Big Data, and Enterprise Architecture Management. He is speaker at international IT conferences such as JavaOne, ApacheCon or OOP, writes articles for professional journals, and shares his experiences with new technologies on his blog.","sameAs":["http:\/\/www.kai-waehner.de\/blog\/","http:\/\/www.linkedin.com\/profile\/view?id=121499132","https:\/\/x.com\/http:\/\/twitter.com\/KaiWaehner"],"url":"https:\/\/www.javacodegeeks.com\/author\/kai-waehner"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1263","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\/352"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1263"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1263\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/52"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}