网站建设与管理读书心得,外贸营销邮件主题一般怎么写,外贸网站建设注意,增城新塘镇 企业网站建设camel eip公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术#xff0c;协议和数据格式。 但是#xff0c;这些应用程序的集成应以标准化的方式建模#xff0c;有效实现并由自动测试支持。 企业集成模式#xff08;EIP#xff09;… camel eip 公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术协议和数据格式。 但是这些应用程序的集成应以标准化的方式建模有效实现并由自动测试支持。 企业集成模式EIP[1]中存在这样的标准该标准已成为描述记录和实现集成问题的行业标准。 Apache Camel [2]实现了EIP并提供了标准化的内部特定于域的语言DSL[3]来集成应用程序。 本文对Apache Camel进行了介绍其中包括一些代码示例。 企业整合模式 EIP可用于将集成问题分解为较小的部分并使用标准化图形对其进行建模。 每个人都可以轻松理解这些模型。 此外无需为每个集成问题而每次都重新发明轮子。 使用EIPApache Camel弥补了建模和实现之间的空白。 EIP模型与Apache Camel的DSL之间几乎存在一对一的关系。 本文使用一个在线商店示例来说明EIP与Apache Camel的关系。 用例在线商店中的订单处理 通过实现一个小用例来介绍Apache Camel的主要概念。 阅读本文后开始自己的项目应该非常容易。 最简单的入门方法是使用Maven原型[4]。 这样您可以在几分钟内重建以下示例。 当然您也可以一次下载整个示例[5]。 图1从EIP角度显示了示例。 任务是处理在线商店的订单。 订单以csv格式到达。 首先必须将订单转换为内部格式。 由于商店只出售dvd和cd因此必须拆分每个订单的订单项。 其他订单项目将转发给合作伙伴。 图 1 EIP集成问题的观点 此示例显示了EIP的优点集成问题分为几个小的持久性子问题。 这些子问题每次都很容易理解和解决。 在描述了用例之后我们现在来看一下Apache Camel的基本概念。 基本概念 Apache Camel在Java虚拟机JVM上运行。 大多数组件都是用Java实现的。 但是这不是新组件的要求。 例如camel-scala组件是用Scala编写的。 Spring框架在某些部分中使用例如用于事务支持。 但是在2.9版[6]中Spring依赖项降至最低。 Apache Camel的核心很小仅包含常用组件即多种技术和API的连接器例如LogFileMock或Timer。 由于Apache Camel的模块化结构可以轻松添加更多组件。建议Maven用于依赖项管理因为大多数技术都需要附加库。 不过当然也可以手动下载库并将其添加到类路径中。 Apache Camel的核心功能是其路由引擎。 它根据相关路由分配消息。 路由包含流和集成逻辑。 它是使用EIP和特定的DSL实现的。 每封邮件都包含一个正文几个标头和可选附件。 消息从提供者发送到消费者。 在两者之间可以对消息进行处理例如过滤或变换。 图1显示了消息如何在路由内更改。 提供者和使用者之间的消息由消息交换容器管理消息交换容器包含唯一的消息ID异常信息传入和传出消息即请求和响应以及使用的消息交换模式MEP。 “仅输入” MEP用于单向消息例如JMS而“输入” MEP执行请求-响应通信例如基于客户端HTTP的请求及其来自服务器端的响应。 在简短解释了Apache Camel的基本概念之后以下各节将提供更多详细信息和代码示例。 让我们从Apache Camel的体系结构开始。 建筑 图2显示了Apache Camel的体系结构。 CamelContext提供运行时系统。 在内部处理器处理端点之间的事务例如路由或转换。 端点连接了多种要集成的技术。 Apache Camel提供了不同的DSL来实现集成问题。 图 2 Apache Camel的体系结构 骆驼语境 CamelContext是Apache Camel的运行时系统并连接其不同的概念例如路由组件或端点。 以下代码片段显示了Java main方法该方法启动CamelContext并在30秒后停止它。 通常CamelContext在加载应用程序时启动并在关机时停止。 public class CamelStarter {public static void main(String[] args) throws Exception {CamelContext context new DefaultCamelContext();context.addRoutes(new IntegrationRoute());context.start();Thread.sleep(30000);context.stop();}} 运行时系统可以包含在JVM环境中的任何位置包括Web容器例如TomcatJEE应用服务器例如IBM WebSphere ASOSGi容器甚至是云中。 领域特定语言 DSL通过使用更高的抽象级别来促进复杂项目的实现。 Apache Camel提供了几种不同的DSL。 JavaGroovy和Scala使用面向对象的概念并为大多数EIP提供了一种特定的方法。 另一方面Spring XML DSL基于Spring框架并使用XML配置。 此外OSGi蓝图XML可用于OSGi集成。 Java DSL具有最佳的IDE支持。 Groovy和Scala DSL与Java DSL类似此外它们还提供了现代JVM语言的典型功能例如简洁的代码或闭包。 与这些编程语言相反Spring XML DSL需要大量XML。 此外它提供了非常强大的基于Spring的依赖项注入机制和漂亮的抽象来简化配置例如JDBC或JMS连接。 在大多数使用情况下选择纯粹是一个品味问题。 甚至可以组合。 许多开发人员使用Spring XML进行配置而路由则以JavaGroovy或Scala实现。 路线 路线是Apache Camel的关键部分。 此处指定了集成的流程和逻辑。 以下示例显示了使用Java DSL的路由 public class IntegrationRoute extends RouteBuilder {Overridepublic void configure() throws Exception {from(“file:target/inbox”).process(new LoggingProcessor()).bean(new TransformationBean(), “makeUpperCase”) .to(“file:target/outbox/dvd”);}} DSL易于使用。 每个人都应该甚至不了解Apache Camel就能理解上面的示例。 该路线实现了所述用例的一部分。 订单从外部来源放置在文件目录中。 处理订单最后将其移动到目标目录。 路由必须扩展“ RouteBuilder”类并覆盖“ configure”方法。 路由本身以“ from”端点开始并在一个或多个“ to”端点处结束。 在这两者之间将实现所有必要的过程逻辑。 在一种“配置”方法中可以实现任意数量的路由。 以下代码段显示了通过Spring XML DSL实现的相同路由 beans … bean class”mwea.TransformationBean” id”transformationBean”/bean class”mwea.LoggingProcessor” id”loggingProcessor”/camelContext xmlns”http://camel.apache.org/schema/spring”packagemwea/packageroutefrom uri”file:target/inbox”/process ref”loggingProcessor”/ bean ref”transformationBean”/to uri”file:target/outbox”//route/camelContext/beans 除了路线Apache Camel的另一个重要概念是它的组件。 它们为几乎所有技术提供集成点。 组件 同时有超过100个组件可用。 除了HTTPFTPJMS或JDBC等广泛的技术外还支持更多技术包括来自AmazonGoogleGoGrid和其他公司的云服务。 每个发行版中都添加了新组件。 通常社区也很容易构建新的自定义组件。 Apache Camel的最惊人的功能是其均匀性。 所有组件都使用相同的语法和概念。 每次集成甚至其自动单元测试都看起来相同。 因此复杂度大大降低了。 考虑更改上面的示例如果应该将订单发送到JMS队列而不是文件目录只需将“ to”端点从“ filetarget / outbox”更改为“ jmsqueueorders”。 而已 当然必须先在应用程序中对JMS进行一次配置 虽然组件提供了技术接口但是可以使用处理器和Bean将自定义集成逻辑添加到路由。 处理器和豆 除了使用EIP您还必须经常添加单独的集成逻辑。 这非常容易并且始终使用相同的概念处理器或Bean。 两者都在上面的路线示例中使用。 处理器是一个简单的Java接口只有一种方法“处理”。 在此方法内您可以执行解决集成问题所需的任何工作例如转换传入的消息调用其他服务等等。 public class LoggingProcessor implements Processor {Overridepublic void process(Exchange exchange) throws Exception {System.out .println(“Received Order: ” exchange.getIn().getBody(String.class));}} “ exchange”参数包含Message Exchange其中包含传入消息传出消息以及其他信息。 由于实现了Processor接口因此您已经依赖于Camel API。 有时这可能是个问题。 也许您已经拥有无法更改的现有集成代码即您无法实现Processor接口 在这种情况下您可以使用Bean也称为POJO普通的旧Java对象。 您将收到传入消息这是方法的参数并返回传出消息如以下片段所示 public class TransformationBean {public String makeUpperCase(String body) {String transformedBody body.toUpperCase();return transformedBody;
}} 上面的bean接收一个String对其进行转换最后将其发送到下一个端点。 再次查看上面的路线。 传入的消息是一个文件。 您可能想知道为什么这样做 Apache Camel提供了另一个强大的功能从头开始包含150多个自动类型转换器例如FileToStringCollectionToObject []或URLtoInputStream。 顺便说一句可以轻松创建其他类型转换器并将其添加到CamelContext [7]。 如果Bean仅包含一个方法则甚至可以在路由中将其省略。 因此上述调用也可以是.beannew TransformationBean而不是.beannew TransformationBean“ makeUpperCase”。 添加更多的企业集成模式 上面的路线在处理输入订单之前先使用翻译器EIP对其进行转换。 除了这种转换之外还需要做更多的工作才能实现整个用例。 因此以下示例中使用了更多EIP public class IntegrationRoute extends RouteBuilder {Overridepublic void configure() throws Exception {from(“file:target/inbox”).process(new LoggingProcessor()).bean(new TransformationBean()).unmarshal().csv().split(body().tokenize(“,”)).choice().when(body().contains(“DVD”)).to(“file:target/outbox/dvd”).when(body().contains(“CD”)).to(“activemq:CD_Orders”).otherwise().to(“mock:others”);}} 每个csv文件说明一个包含一个或多个订单项的单个订单。 camel-csv组件用于转换csv消息。 然后拆分器EIP分离消息正文的每个订单项。 在这种情况下将使用默认的分隔符逗号。 但是复杂的正则表达式或脚本语言例如XPathXQuery或SQL也可以用作拆分器。 每个订单项都必须发送到特定的处理单元请记住有DVD订单CD订单和其他已发送给合作伙伴的订单。 基于内容的路由器EIP无需任何单独的编码工作即可解决此问题。 DVD订单通过文件目录处理而CD订单发送到JMS队列。 在此示例中ActiveMQ用作JMS实现。 要将ActiveMQ支持添加到Camel应用程序只需为camel-activemq组件添加相关的maven依赖关系或手动将JAR添加到类路径。 而已。 其他一些组件一次需要更多配置。 例如如果要使用WebSphere MQ或其他JMS实现而不是ActiveMQ则必须配置JMS提供程序。 除了dvds和cd外所有其他订购商品都发送给合作伙伴。 不幸的是该界面尚不可用。 相反使用Mock组件暂时模拟此接口。 上面的示例令人印象深刻地展示了如何在一个路由中使用不同的接口在这种情况下为FileJMS和Mock。 尽管技术差异很大但您始终会应用相同的语法和概念。 自动单元和集成测试 自动测试至关重要。 但是它通常在集成项目中被忽略。 原因是由于几种不同的技术而导致的过多努力和很高的复杂性。 Apache Camel解决了这个问题它通过JUnit扩展提供测试支持。 测试类必须扩展CamelTestSupport才能使用Camel强大的测试功能。 除了其他声明外还隐式支持模拟。 不需要其他模拟框架例如EasyMock或Mockito。 您甚至可以模拟分别通过生产者或使用者模板将消息发送到路由或从路由接收消息。 使用该测试套件可以自动测试所有路线。 值得一提的是每种技术的语法和概念都相同。 下面的代码片段显示了示例路线的单元测试 public class IntegrationTest extends CamelTestSupport {Beforepublic void setup() throws Exception {super.setUp();context.addRoutes(new IntegrationRoute());}Testpublic void testIntegrationRoute() throws Exception {// Body of test message containing several order itemsString bodyOfMessage “Harry Potter / dvd, Metallica / cd, Claus Ibsen –Camel in Action / book “;// Initialize the mock and set expected resultsMockEndpoint mock context.getEndpoint(“mock:others”,MockEndpoint.class);mock.expectedMessageCount(1);mock.setResultWaitTime(1000);// Only the book order item is sent to the mock// (because it is not a cd or dvd)String bookBody “Claus Ibsen – Camel in Action / book”.toUpperCase();mock.expectedBodiesReceived(bookBody);// ProducerTemplate sends a message (i.e. a File) to the inbox directorytemplate.sendBodyAndHeader(“file://target/inbox”, bodyOfMessage, Exchange.FILE_NAME , “order.csv”);Thread.sleep(3000);// Was the file moved to the outbox directory?File target new File(“target/outbox/dvd/order.csv”);assertTrue(“File not moved!”, target.exists());// Was the file transformed correctly (i.e. to uppercase)?String content context.getTypeConverter().convertTo(String.class, target);String dvdbody “Harry Potter / dvd”.toUpperCase();assertEquals(dvdbody, content);// Was the book order (i.e. „Camel in action“ which is not a cd or dvd) sent to the mock?mock.assertIsSatisfied();}}setup方法创建一个CamelContext实例并执行一些其他操作。 之后添加路由以便可以对其进行测试。 测试本身会创建一个模拟并设定其期望值。 然后生产者模板将消息发送到路由的“ from”端点。 最后一些断言验证了结果。 该测试可以与其他JUnit测试相同的方式运行直接在IDE中或在构建脚本中。 甚至敏捷的测试驱动开发TDD都是可能的。 首先在实现相应的路由之前必须编写Camel测试。 如果您想了解有关Apache Camel的更多信息第一个地址应该是“ Camel in Action”一书[8]其中详细介绍了所有基础知识和许多高级功能包括每章的工作代码示例。 胃口大开之后让我们现在讨论何时使用Apache Camel… 系统集成的替代方案 图3显示了用于集成应用程序的三种选择 自己的定制解决方案 实施一个针对您的问题的单独解决方案而无需将问题分成几小部分。 这可行并且可能是小型用例的最快替代方案。 您必须自己编写所有代码。 集成框架 使用一个框架该框架有助于使用几种集成模式以标准化的方式集成应用程序。 它大大减少了工作量。 每个开发人员都会很容易理解您的工作。 您不必每次都重新发明轮子。 企业服务总线ESB 使用ESB集成您的应用程序。 在幕后ESB通常还使用集成框架。 但是还有更多功能例如业务流程管理注册表或业务活动监视。 通常您可以在图形用户界面中配置路由和诸如此类的东西您必须自行决定是否可以降低复杂性和工作量。 通常ESB是一个复杂的产品。 与使用轻量级集成框架相比学习曲线要高得多。 但是因此您将获得一个非常强大的工具该工具应该可以满足大型集成项目中的所有要求。 如果您决定使用集成框架那么在JVM环境中您仍然可以选择三种不错的选择Spring Integration [9]Mule [10]和Apache Camel。 它们都是轻量级的易于使用和实施EIP。 因此它们提供了一种集成应用程序的标准化方法即使在非常复杂的集成项目中也可以使用它们。 可以在[11]中找到这三个集成框架的更详细的比较。 我个人最喜欢的是Apache Camel这是因为它具有出色的JavaGroovy和Scala DSL并结合了许多受支持的技术。 Spring Integration和Mule仅提供XML配置。 仅当我需要Mule的一些独特的连接器来连接专有产品例如SAPTibco RendevousOracle Siebel CRMPaypal或IBM的CICS交易网关时才使用Mule。 如果仅需要集成广泛的技术例如FTPHTTP或JMS则仅在现有的Spring项目中使用Spring Integration。 在所有其他情况下我将使用Apache Camel。 尽管如此无论您选择这些轻量级集成框架中的哪个都可以通过轻松的工作轻松实现复杂的集成项目这将带来很多乐趣。 切记繁琐的ESB通常具有太多的功能因此也有太多不必要的复杂性和工作量。 使用正确的工具完成正确的工作 Apache Camel已准备好用于企业集成项目 Apache Camel已于2011年7月庆祝其第四个生日[12]它代表了一个非常成熟且稳定的开源项目。 它支持在企业项目中使用的所有要求例如错误处理事务可伸缩性和监视。 也提供商业支持。 最重要的收获是其可用的DSL几乎每种可考虑的技术都有许多组件并且事实是无论必须集成哪种技术都可以始终使用相同的语法和概念甚至用于自动测试。 因此应始终将Apache Camel视为重量级ESB的轻量级替代品。 通过下载本文的示例开始。 如果您需要任何帮助或更多信息可以找到一个很棒的社区和一本写得很好的书。 资料来源 [1]“企业集成模式设计构建和部署消息解决方案”ISBN0321200683Gregor HohpeBobby Woolf [2] Apache Camel http://camel.apache.org [3]内部DSL http://martinfowler.com/bliki/DomainSpecificLanguage.html [4]骆驼原型http://camel.apache.org/camel-maven-archetypes.html [5] github https://github.com/megachucky/camel-infoq上本文的示例代码 [6]减少对Spring JAR的依赖http://davsclaus.blogspot.com/2011/08/apache-camel-29-reduced-dependency-on.html [7]骆驼类型转换器http://camel.apache.org/type-converter.html [8]“行动中的骆驼”国际标准书号ISBN1935182366克劳斯·易卜生乔纳森·安斯特Jonathan Anstey哈德良·扎巴尔恰Hadrian Zbarcea [9] Spring Integration www.springsource.org/spring-integration [10] Mule ESB http://www.mulesoft.org [11] Apache CamelMule ESB和Spring Integration的比较http://www.kai-waehner.de/blog/2012/01/10/spoilt-for-choice-which-integration-framework-to-use-spring集成m子或阿帕奇骆驼 [12]阿帕奇骆驼诞辰四周年http://camel.apache.org/2011/07/07/happy-birthday-camel.html 参考 Apache Camel教程– 有关Java EE / SOA /云计算博客的JCG合作伙伴 Kai Wahner的EIP路由组件测试和其他概念的介绍 。 翻译自: https://www.javacodegeeks.com/2012/05/apache-camel-tutorial-introduction-to.htmlcamel eip