ServiceMix学习笔记最终版.docx
《ServiceMix学习笔记最终版.docx》由会员分享,可在线阅读,更多相关《ServiceMix学习笔记最终版.docx(13页珍藏版)》请在冰豆网上搜索。
ServiceMix学习笔记最终版
ServiceMix学习笔记
1ServiceMix安装即入门(参考appacheServiceMix官网)
首先在http:
//servicemix.apache.org/download.html下载ServiceMix的压缩包,解压后即可。
安装完ServiceMix后,切换到其跟目录下的bin文件夹内,点击ServiceMix.bat即可运行。
安装ServiceMix的插件或发布Sa部件只需将其拷贝到hotdeploy目录下,然后启动ServiceMix即可。
2ServiceMix的几个重要概念(参考网上资料)
ServiceMix实现了JBI标准,下面是对JBI标准的简要描述。
JBI:
JBI是java的标准,它通过使用可插入式的组件来构建集成系统,这些可插入式的组件通过NM来相互传送消息。
消息交换的模式是基于网络服务脚本语言(WSDL)的。
图1JBI可插入式框架
图1中显示了每个组件可以通过插拔式的方式添加到JBI或从JBI中删除。
图2JBI解耦
图2显示了消息在组件A和B之间的传递。
图3JBI架构
JBI组件分类:
∙服务引擎(ServiceEngines)(SE)提供业务逻辑和事务服务,并消费这些服务.
∙关联组件(BindingComponents)(BC)提供外部的服务与JBI环境的通信连接(provideconnectivitytoservicesexternaltotheJBIenvironment).
服务引擎(Serviceengines)和关联组件(bindingcomponents)可以充当服务提供者又可以充当消费者或者二者兼具。
ServiceMix实现了JBI标准,它运行的基本原理是:
Servicemix使用consumer接受到客户request,在Servicemix的服务列表中寻找服务,并且发布一个EndPoint,然后再provider中发布一个指向目标service的服务。
ServiceUnit(SU):
服务单元。
ServiceAssembly(SA服务装配组件):
是SU单元的集合。
在servicemix上发布一项服务,其实是发布一个服务集(SA),在这个集合中,可能存在一个或者多个服务(SU)。
例如用户有一个请求需要顺序使用两个webservice,这样我们可以定义两个SU分别对应不同的webservice,然后使用一个SA将这两个SU统合起来这样,我们就可以调用一个暴露在外面的SA服务,来达到使用两个webservice的目的。
也就是说在整个过程种Servicemix充当一个Proxy,即将一个外部的WebService发布到ServiceMix服务当中。
使得客户可以通过调用暴露在外面的Servicemix的服务端口来调用实际上在其他服务器上的WebService。
3创建Maven项目(参考Maven权威指南)
3.1Maven的作用
Maven是一个项目管理工具,它包含了一个项目对象模型(ProjectObjectModel),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(DependencyManagementSystem),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。
3.2Maven的核心概念
Maven插件和目标(PluginsandGoals):
插件指的是完成一项工作所需要的工具,而目标即是需要完成的工作。
例如:
在appache例子中有一个:
mvnarchetype:
create-DarchetypeArtifactId=servicemix-service-unitDarchetypeGroupId=org.apache.servicemix.tooling-DartifactId=tutorial-file-su这个命令,其中的archtype就是插件,而create就是要完成的目标。
Maven生命周期(Lifecycle):
完成一个目标,可能会有多个阶段组成,而这各个阶段就生命周期的不同阶段,所有这些生命周期阶段就组成了整个生命周期,例如在create过程中,就可能包含又编译、链接等等阶段。
Maven坐标(Coordinates):
Archetype插件通过名字为pom.xml(项目对象模型(POM),一个项目的声明性描述。
)的文件创建了一个项目。
在pom.xml中有groupId,artifactId,version和packaging,他们一起组成了Maven坐标,maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者MavenPOM里的一个插件。
也就是说我们在创建项目、插件等时,需保证它的唯一性。
Maven仓库:
一个Maven仓库是项目构件的一个集合,这些构件存储在一个目录结构下面,它们的格式能很容易的被Maven所理解。
在一个Maven仓库中,所有的东西存储在一个与Maven项目坐标十分匹配的目录结构中。
当第一次构建项目时,如果发现所需要的依赖项在仓库里面没有,则会从远处下载。
Maven依赖管理(DependencyManagement):
一个项目可能会依赖于其它项目,而这些依赖项我们在maven中只需要添加其直接依赖项,对于间接依赖项maven会为我们去查找处理。
(可以通过mvnsite来生成项目的文档和报告)
3.3创建Maven项目(参考AppacheserviceMix中的例子)
(A)、创建一个新的目录,在目录中创建pom.xml文件,在文件内输入下面的代码:
xmlversion="1.0"encoding="utf-8"?
>
//maven.apache.org/POM/4.0.0"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//maven.apache.org/POM/4.0.0http:
//maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.apache.servicemix.tutorial
parent
1.0-SNAPSHOT
pom
Tutorial
http:
//servicemix.org
上面标示红色的部分即为maven项目的坐标。
(B)、打开控制台,切换到该目录下,输入mvnarchetype:
create-DarchetypeArtifactId=servicemix-service-unit-DarchetypeGroupId=org.apache.servicemix.tooling-DartifactId=tutorial-file-su
就可以创建一个(SU)。
(C)、这时候你可以对产生的tutorial-file-su目录下的pom.xml文件进行定制(修改项目名字等),定制完成之后,切换到顶级目录,输入
mvnarchetype:
create-DarchetypeArtifactId=servicemix-service-assembly-DarchetypeGroupId=org.apache.servicemix.tooling-DartifactId=tutorial-sa
(D)、这时会生成tutorial-sa目录,在该目录下生成的pom.xml文件中添加我们所要增加的su服务,也可以对其进行适当定制,完成之后切换到顶级目录。
输入mvninstall即完成整个sa的生成。
4Camel的使用(参考Camel手册)
4.1Camel的作用
对camel的英文介绍:
ApacheCamelisapowerfulopensourceintegrationframeworkbasedonknownEnterpriseIntegrationPatternswithpowerfulBeanIntegration.CamelletsyoucreatetheEnterpriseIntegrationPatternstoimplementroutingandmediationrulesineitheraJavabasedDomainSpecificLanguage(orFluentAPI),viaSpringbasedXmlConfigurationfilesorviatheScalaDSL.ThismeansyougetsmartcompletionofroutingrulesinyourIDEwhetherinyourJava,ScalaorXMLeditor.ApacheCamelusesURIssothatitcaneasilyworkdirectlywithanykindofTransportormessagingmodelsuchasHTTP,ActiveMQ,JMS,JBI,SCA,MINAorCXFBusAPItogetherwithworkingwithpluggableDataFormatoptions.ApacheCamelisasmalllibrarywhichhasminimaldependenciesforeasyembeddinginanyJavaapplication.ApacheCamelletsyouworkwiththesameAPIregardlesswhichkindofTransportused,solearntheAPIonceandyouwillbeabletointeractwithalltheComponentsthatisprovidedout-of-the-box.ApacheCamelhaspowerfulBeanBindingandintegratedseamlesswithpopularframeworkssuchasSpringandGuice.ApacheCamelhasextensiveTestingsupportallowingyoutoeasilyunittestyourroutes.ApacheCamelcanbeusedasaroutingandmediationengineforthefollowingprojects:
•ApacheServiceMixwhichisthemostpopularandpowerfuldistributedopensource
ESBandJBIcontainer
•ApacheActiveMQwhichisthemostpopularandpowerfulopensourcemessage
broker
•ApacheCXFwhichisasmartwebservicessuite(JAX-WS)
•ApacheMINAanetworkingframework
大概意思是说,camel可以采用JAVADSL或者XML或者ScalaDSL来实现消息路由,使得消息能够按照预设路径一步一步的由producter到consumer。
Camel通过使用URI可以支持类似sHTTP,ActiveMQ,JMS,JBI,SCA,MINAorCXFBusAPI提供的数据格式。
并且Camel可以与流行的框架spring进行集成,支持单元测试。
4.2Camel的使用
(A)、创建CamelContext对象:
CamelContextcontext=newDefaultCamelContext();
(B)、设置消息路由,有一下几种方式:
(a)、直接将RouteBuilder类的实例加入,例如:
context.addRoutes(newRouteBuilder(){
publicvoidconfigure(){
from("test-jms:
queue:
test.queue").to("file:
//test");//setupalisteneronthefilecomponent
from("file:
//test").process(newProcessor(){
publicvoidprocess(Exchangee){
System.out.println("Receivedexchange:
"+e.getIn());
}
});
}
});
(b)、将JMS组件加入,例如:
ConnectionFactoryconnectionFactory=new
ActiveMQConnectionFactory("vm:
//localhost?
broker.persistent=false");//Notewecanexplicitynamethecomponent
context.addComponent("test-jms",
JmsComponent.jmsComponentAutoAcknowledge(connectionFactory);
(c)、指定ActiveMQ组件的URL地址添加,例如:
camelContext.addComponent("activemq",
activeMQComponent("vm:
//localhost?
broker.persistent=false"));
(C)、创建消息(通常情况下由外部用户提供)
ProducerTemplatetemplate=context.createProducerTemplate();
(D)、启动Camel
camelContext.start();
(E)、向camel发送消息
for(inti=0;i<10;i++){
template.sendBody("test-jms:
queue:
test.queue","TestMessage:
"+i);
}
4.3创建camel项目(AppacheServiceMix官网)
(A)、新建一个目录,在目录中添加pom.xml文件,在文件中添加如下代码:
xmlversion="1.0"encoding="utf-8"?
>
//maven.apache.org/POM/4.0.0"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//maven.apache.org/POM/4.0.0http:
//maven.apache.org/maven-v4_0_0.xsd">
4.0.0
org.apache.servicemix.tutorial.camel
parent
1.0-SNAPSHOT
pom
SMX-Camel:
:
Tutorial
http:
//servicemix.apache.org
(B)、然后返回顶级目录,打开控制台窗口,并键入
mvnarchetype:
create-DarchetypeArtifactId=servicemix-camel-service-unit
-DarchetypeGroupId=org.apache.servicemix.tooling
-DartifactId=tutorial-camel-su
就可以创建一个SUproject。
(C)、返回顶级目录键入:
mvnarchetype:
create-DarchetypeArtifactId=servicemix-service-assembly
-DarchetypeGroupId=org.apache.servicemix.tooling-DartifactId=tutorial-camel-sa
创建一个SAproject,再讲对suproject的项目依赖添加到sa产生的pom.xml文件中。
(D)、将tutorial-camel-suproject文件中的camel-context.xml中的package元素内容修改为org.apache.servicemix.tutorial.camel,然后将org.apache.servicemix.tutorial.camel.MyRouteBuilder类中的configure修改为(采用了dsl语法)publicvoidconfigure(){
from("timer:
//tutorial?
fixedRate=true&delay=3000&period=10000")//1
.setBody(constant("Helloworld!
"))//2
.to("log:
tutorial");//3
}
(E)、切换到顶级目录,键入mvninstall创建项目,将得到的tutorial-camel-sa下的jar文件拷贝到hotdeploy目录下,启动ServiceMix完成发布。
5JMS详解(参考网上资料)
5.1JMS的作用
JMS提供了一种访问企业消息系统的方法,即面向消息的中间件(MOM)。
MOM通过中间媒介以间接方式在应用程序之间异步传送数据,提供了一种以松散耦合的灵活方式集成应用程序的机制。
JMS实现的功能就是一个存储和转发的功能。
多个应用程序可以就一个主题发布和订阅消息,而应用程序对其他人仍然是匿名的。
MOM起着代理(broker)的作用,将一个主题已发表的消息路由给该主题的所有订阅者。
JMS是一组接口和相关语义,它定义了JMS客户如何访问企业消息产品的功能。
JMS消息的通信方式有两种即:
点对点方式(point-to-point)点对点的消息发送方式主要建立在MessageQueue,Sender,reciever上,MessageQueue存贮消息,Sender发送消息,receiver接收消息.具体点就是SenderClient发送MessageQueue,而receiverCliernt从Queue中接收消息和"发送消息已接受"到Quere,确认消息接收。
消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在任何时刻发送信息到Queue,而不需要知道接收客户端是不是在运行;发布/订阅方式(publish/subscriberMessaging)用于多接收客户端的方式。
作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。
一个接收端只能接收他创建以后发送客户端发送的信息。
作为subscriber,在接收消息时有两种方法,destination的receive方法,和实现messagelistener接口的onMessage方法。
5.2JMS程序的创建过程
首先介绍关于JMS的几个重要接口:
ConnectionFactory:
一个创建Connection的受管理对象。
Connection:
连接到提供者的活动连接。
Destination:
一个封装消息目的地的身份的受管理对象,如消息的来源地和发送地。
Session:
发送和接收消息的单线程环境。
为了简化,并且因为Session控制事务的缘故,通过多个线程进行并发访问受到了限制。
可以将多个Session用于多线程应用程序。
MessageProducer:
用于发送消息。
MessageConsumer:
用于接收消息。
一个典型的JMS程序要经过以下步骤才能开始产生和使用消息:
(A)、通过JNDI(JNDI是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC,都是构建在抽象层上。
)查询ConnectionFactory。
(B)、通过JNDI查询一个或者多个Destination。
(C)、用ConnectionFactory创建一个Connection。
(D)、用Connection创建一个或者多个Session。
(E)、用Session和Destination创建所需要的MessageProducer和MessageConsumer。
(F)、启动Connection。
经过以上几个步骤后,消息就可以开始流动,应用程序可以根据需要接收、处理和发送消息。
5.3JMS示例程序
消息生产者向JMS发送消息的示例:
importjava.util.*;
importjavax.naming.*;
importjavax.jms.*;
publicclassMessageProducter{
publicstaticvoidmain(String[]args){
//JMSConnectionFactory的JNDI
StringqueueConnectionFactoryName="myjmsconnectionfactory";
//JMSQueue或者JMSTopic的JNDI
StringqueueName="myjmsqueue";
//transaction模式
booleantransacted=false;
//acknowledgement模式
intacknowledgementMode=Session.AUTO_ACKNOWLEDGE;
//需要发送的消息
Stringmessage="Messageneedtosend";
Propertiesproperties=ne