Apache Camel教程– EIP,路由,组件,测试和其他概念的简介

公司之间的数据交换增加了很多。 必须集成的应用程序数量也增加了。 这些接口使用不同的技术,协议和数据格式。 但是,这些应用程序的集成应以标准化的方式建模,有效实现并由自动测试支持。 企业集成模式(EIP)[1]中存在这样的标准,该标准已成为描述,记录和实现集成问题的行业标准。 Apache Camel [2]实现了EIP,并提供了标准化的内部特定于域的语言(DSL)[3]来集成应用程序。 本文对Apache Camel进行了介绍,其中包括一些代码示例。

企业整合模式

EIP可用于将集成问题分解为较小的部分,并使用标准化图形对其进行建模。 每个人都可以轻松理解这些模型。 此外,无需针对每个集成问题每次都重新发明轮子。

使用EIP,Apache 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实现的。 但是,这不是新组件的要求。 例如,骆驼标本组件是用Scala编写的。 Spring框架在某些部分中使用,例如,用于事务支持。 但是,在2.9版[6]中,Spring依赖项已降至最低。 Apache Camel的核心很小,仅包含常用组件(即,几种技术和API的连接器),例如Log,File,Mock或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容器(例如Tomcat),JEE应用服务器(例如IBM WebSphere AS),OSGi容器,甚至是云中。

领域特定语言

DSL通过使用更高的抽象级别来促进复杂项目的实现。 Apache Camel提供了几种不同的DSL。 Java,Groovy和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进行配置,而路由是通过Java,Groovy或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”><package>mwea</package><route><from uri=”file:target/inbox”/><process ref=”loggingProcessor”/> <bean ref=”transformationBean”/><to uri=”file:target/outbox”/></route></camelContext></beans>

除了路线,Apache Camel的另一个重要概念是它的组件。 它们为几乎所有技术提供集成点。

组件

同时,有超过100个组件可用。 除了HTTP,FTP,JMS或JDBC等广泛的技术外,还支持更多技术,包括来自Amazon,Google,GoGrid和其他公司的云服务。 每个发行版中都添加了新组件。 通常,社区也很容易构建新的自定义组件。

Apache Camel的最惊人的功能是其均匀性。 所有组件都使用相同的语法和概念。 每次集成,甚至其自动单元测试都看起来相同。 因此,复杂度大大降低了。 考虑更改上面的示例:如果应该将订单发送到JMS队列而不是文件目录,只需将“ to”端点从“ file:target / outbox”更改为“ jms:queue:orders”。 而已! (当然,必须先在应用程序中对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多个自动类型转换器,例如FileToString,CollectionToObject []或URLtoInputStream。 顺便说一句:可以轻松创建其他类型转换器并将其添加到CamelContext [7]。

如果Bean仅包含一个方法,则甚至可以在路由中将其省略。 因此,上述调用也可以是.bean(new TransformationBean())而不是.bean(new 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分离消息正文的每个订单项。 在这种情况下,将使用默认的分隔符(逗号)。 但是,复杂的正则表达式或脚本语言(例如XPath,XQuery或SQL)也可以用作拆分器。

每个订单项目都必须发送到特定的处理单元(请记住:有DVD订单,CD订单和其他已发送给合作伙伴的订单)。 基于内容的路由器EIP无需任何单独的编码工作即可解决此问题。 DVD订单通过文件目录处理,而CD订单发送到JMS队列。

在此示例中,ActiveMQ用作JMS实现。 要将ActiveMQ支持添加到Camel应用程序,只需为camel-activemq组件添加相关的maven依赖关系,或手动将JAR添加到类路径中。 而已。 其他一些组件一次需要更多配置。 例如,如果要使用WebSphere MQ或其他JMS实现而不是ActiveMQ,则必须配置JMS提供程序。

除了dvds和cd以外,所有其他订购商品都发送给合作伙伴。 不幸的是,该界面尚不可用。 相反,使用Mock组件暂时模拟此接口。

上面的示例令人印象深刻地展示了如何在一个路由中使用不同的接口(在本例中为File,JMS和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,这是因为它具有出色的Java,Groovy和Scala DSL,并结合了许多受支持的技术。 Spring Integration和Mule仅提供XML配置。 如果我需要Mule的某些独特的连接器来连接专有产品(例如SAP,Tibco Rendevous,Oracle Siebel CRM,Paypal或IBM的CICS交易网关),则仅使用Mule。 如果仅需要集成广泛的技术(例如FTP,HTTP或JMS),则仅在现有的Spring项目中使用Spring Integration。 在所有其他情况下,我将使用Apache Camel。

尽管如此:无论您选择这些轻量级集成框架中的哪个,都可以通过轻松的工作轻松实现复杂的集成项目,这将带来很多乐趣。 切记:繁琐的ESB通常具有太多的功能,因此也有太多不必要的复杂性和工作量。 使用正确的工具完成正确的工作!

Apache Camel已准备好用于企业集成项目

Apache Camel已于2011年7月庆祝其第四个生日[12],它代表着一个非常成熟且稳定的开源项目。 它支持在企业项目中使用的所有要求,例如错误处理,事务,可伸缩性和监视。 也提供商业支持。

最重要的收获是其可用的DSL,几乎每种可考虑的技术都有许多组件,并且事实是,无论必须集成哪种技术,都可以始终使用相同的语法和概念(甚至用于自动测试)。 因此,应该始终将Apache Camel视为重量级ESB的轻量级替代品。 通过下载本文的示例开始。 如果您需要任何帮助或更多信息,可以找到一个很棒的社区和一本写得很好的书。

资料来源:

  • [1]“企业集成模式:设计,构建和部署消息解决方案”,ISBN:0321200683,Gregor Hohpe,Bobby 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]“行动中的骆驼”,国际标准书号(ISBN):1935182366,克劳斯·易卜生,乔纳森·安斯特伊,哈德良·扎巴尔恰
  • [9] Spring Integration www.springsource.org/spring-integration
  • [10] Mule ESB http://www.mulesoft.org
  • [11] Apache Camel,Mule 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.html

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

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

相关文章

iOS开发UI篇—UITableview控件简单介绍

一、基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 。 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView&#xff0c;UITableView继承自UIScrollView,因此支持垂直滚动,⽽且性能极佳 。 UITableview有分组和不分组两种样式&#xff0c;可以在storyboard或…

动态ADF火车:以编程方式添加火车停靠站

我将展示如何以编程方式“即时”将火车停靠站添加到ADF火车中。 在我的用例中&#xff0c;我有一些票务预订应用程序。 它具有训练模型的有限任务流。 在火车的第一站&#xff0c;用户输入乘客的数量&#xff0c;在随后的站点&#xff0c;他们输入一些乘客的信息。 带有乘客信息…

关于存储过程权限

关于ORACLE账号的权限问题&#xff0c;一般分为两种权限&#xff1a; 系统权限: 允许用户执行特定的数据库动作&#xff0c;如创建表、创建索引、创建存储过程等 对象权限: 允许用户操纵一些特定的对象&#xff0c;如读取视图&#xff0c;可更新某些列、执行存储过程等 像这种查…

宁波镇海2021年高考成绩查询,最新!2021年,宁波镇海区的这14所中小学“爆了...

宁波镇海区教育局发布了2021年公办学校小学一年级、初中一年级招生第一次预警&#xff0c;这也是宁波首个发布2021年公办学校招生预警的县、市、区。根据最新数据摸排&#xff0c;宁波镇海区有8所小学红色预警、2所初中红色预警&#xff0c;1所小学黄色预警、3所初中黄色预警。…

超出了GC开销限制– Java堆分析

这篇文章是我们原来的GC超出限制的问题模式帖子的延续。 正确的Java堆分析对于消除O​​utOfMemoryError&#xff1a;GC开销问题至关重要。 如果您不熟悉此Java HotSpot 1.6错误&#xff0c;建议您首先阅读有关此主题的第一篇文章 。 本文将为您提供一个示例程序和一个教程&…

cdockpane限制调整大小_影视后期制作小伙伴必看:使用AU对声音质量进行调整的三大技巧...

一、增幅一般人进入AU的音频调整界面&#xff0c;会使用图中的旋钮进行音量调整&#xff0c;这种操作是错误的&#xff0c;因为通过拖拽并不能确定调整音量的大小幅度&#xff0c;精准度极低&#xff0c;反复操作才能试出最佳音量&#xff0c;效率极低。最优方案是使用左侧效果…

华润置地php面试题_从一流到顶流|2020华润置地与沈阳一起美好

如果用一句话来形容华润置地进入沈阳13年的发展历程&#xff0c;你认为是什么&#xff1f;“从优秀到卓越”。用2020年的语言你给我翻译一下&#xff1f;“从一流到顶流”&#xff01;01/ 初识的美好犹记2007年1月&#xff0c;央企华润置地首进沈阳&#xff0c;在大馆原址呈现出…

cmd控制屏幕光标_电脑控制手机?上班时间愉快尽情地玩手机吧!它值得您拥有!...

在现今时代&#xff0c;手机已成为人们必不可少的工具&#xff0c;有的时候甚至可以说手机比电脑方便好用多了&#xff0c;例如某些实用的APP软件就只有手机端并没有电脑端&#xff0c;想使用的话就得整天捧着手机盯着不放。但别忘记&#xff0c;我们大多数都是打工族&#xff…

xp系统设置锁定计算机,系统锁定时不关机的诀窍 给XP系统关闭计算机再加一把锁...

很多用户抱怨在使用电脑的过程中&#xff0c;总是经常会被琐碎的事情打断&#xff0c;有时候难免暂时离开电脑&#xff0c;处于便利和资料安全&#xff0c;我们往往会按下“WindowsL”来锁定计算机。这样&#xff0c;操作方便同时又能阻止他人乱动我们的计算机。但是如果遇到好…

gitee项目404问题_七款开源项目,让你数据库管理不再成为一个问题

在开发过程中&#xff0c;数据库是必不可少的一环&#xff0c;但大多数情况下开发者们还是在用命令行来管理数据库。虽然在外人看起来输入一行行代码非常的酷炫&#xff0c;但其中的繁琐可能也只有开发者知道。七款开源项目&#xff0c;让你数据库管理不再成为一个问题今天 Git…

vb 窗体html表格,VB.Net – 高级表格

在本章中&#xff0c;让我们研究以下概念 :在应用程序中添加菜单和子菜单在表单中添加剪切&#xff0c;复制和粘贴功能锚定和对接控件表格模态表格添加菜单和子菜单应用程序中的菜单传统上&#xff0c;菜单&#xff0c;MainMenu&#xff0c;ContextMenu和MenuItem类用于在Windo…

SpringMVC后台接收list类型的数据的实现方式

一、背景 最近在做一些东西的时候&#xff0c;遇到一个需要Springmvc后台接收list类型数据的需求&#xff0c;几经辗转才完美解决了这个问题&#xff0c;今天记下来方便以后使用&#xff0c;也分享给需要的小伙伴们~ 二、实现方式 实现方式一 前端页面 1 <% page language&q…

Maven集成测试和Spring Restful Services

介绍 我的原始博客通过一个非常简单的示例展示了如何分离Maven单元和集成测试。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后&#xff0c;许多人要求我提供比最初使用的示例更实际的示例。 这篇文章展示了如何在实际环境中&#…

玩cf出现outofmemory_CF画质粗糙平衡感人,却能历经十年经久不衰,靠的是什么?...

Hello大家好&#xff0c;我是沐辰。《穿越火线》这款游戏国内运营时间已长达十年&#xff0c;从最早接触这款游戏开始&#xff0c;很多玩家都在这里烙刻下了许多关于青春的回忆。CF的许多问题一直颇受诟病&#xff0c;例如落后且粗糙的画质、英雄级武器与平民武器的巨大差距、千…

jquery遍历ajax返回的json数据

我们以前在前端遍历ajax拿到的数据一般都是用for或其他方式遍历&#xff0c;这样做麻烦且费事&#xff0c;效率不高&#xff0c;下面提供一个函数&#xff0c;只需调用函数即可把数据遍历出来&#xff0c;方便高效。 html代码&#xff1a; <html> <head><script…

Apache JMeter:随心所欲进行负载测试

这是有关使用Apache JMeter进行负载测试的第二篇文章&#xff0c;请在此处阅读第一篇文章&#xff1a; 有关对关系数据库进行负载测试的分步教程。 JMeter有很多采样器 。 如果您需要JMeter不提供的采样器&#xff0c;则可以编写自定义采样器。 &#xff08;自定义采样器在JMet…

致敬词

见义勇为致敬词 面对灾难和死神&#xff0c;你们大义凛然、知险而上&#xff0c;把平安和生机留给他人&#xff0c;把困难和危险留给自己。巍巍乎高山景行&#xff0c;铮铮然铁骨侠风&#xff1b;壮志谱传奇&#xff0c;热血写春秋。你们是&#xff1a;百姓英雄&#xff0c;平安…

经常使用计算机的孩子,常玩电脑对孩子负面影响大,家长们不容小觑!

相信不少的家庭都会备有电脑&#xff0c;人们在网络世界里面能够找到自己需要的东西。不仅是大人喜欢玩电脑&#xff0c;小孩也喜欢玩电脑。然而常玩电脑对孩子负面影响大吗&#xff1f;有多大&#xff1f;一、行为问题全国青少年教育协会指出&#xff0c;5岁以下的使用电脑的孩…

VMware下ubuntu与Windows实现文件共享的方法

最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下&#xff0c;就进行了共享文件夹的设置&#xff0c;期间遇到一些困难&#xff0c;记录下来&#xff0c;方便以后遇到此类问题不再困惑。 &#xff08;记录只为更好的分享&#xff09; 言归正传&#xff1a; 1、首先需要在u…

mybatis入门-新手注意问题

参数问题 在映射文件中通过parameterType指定输入参数的类型&#xff1b;在映射文件中通过resultType指定输出结果的类型。 占位符和拼接符问题 #{}表示一个占位符号&#xff0c;#{}接收输入参数&#xff0c;类型可以是简单类型&#xff0c;pojo、hashmap。 如果接收简单类型&a…