Oracle Service Bus 12C开发基础-Oracle EBS技术文档_第1页
Oracle Service Bus 12C开发基础-Oracle EBS技术文档_第2页
Oracle Service Bus 12C开发基础-Oracle EBS技术文档_第3页
Oracle Service Bus 12C开发基础-Oracle EBS技术文档_第4页
Oracle Service Bus 12C开发基础-Oracle EBS技术文档_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DocRef:REFDocRefNumber<DocumentReferenceNumber>REFLastDateMarch9,2011STYLEREFHD2TransportsIfSection2>1“DateAuthorVersionChangeReferenceCREATEDATE\@"d-MMM-yy"23-Aug-15BoQiang.Zhang1.0NoPreviousDocumentReviewersNamePositionDistributionCopyNo.NameLocationLibraryMasterProjectLibraryProjectManagerNoteToHolders:Ifyoureceiveanelectroniccopyofthisdocumentandprintitout,pleasewriteyournameontheequivalentofthecoverpage,fordocumentcontrolpurposes.Ifyoureceiveahardcopyofthisdocument,pleasewriteyournameonthefrontcover,fordocumentcontrolpurposes.ContentsTOC\o"2-3"DocumentControl ii1. 简介 21.1. OracleServiceBus 21.2. JDeveloper 42. 环境搭建 72.1. 数据库环境搭建 72.2. 开发环境搭建 73. OSB控件简介 83.1. MessageFlow 83.2. RouteActions 93.3. StageAction 104. 集成规范 135. 开发简介 146. MessageContext 157. Adapter 167.1. DatabaseObjects 167.2. DatabasePrograms 527.3. AppAdapter 638. Transports 649. 服务监控 6510. 服务权限 661. OpenandClosedIssuesforthisDeliverable 67OpenIssues 67ClosedIssues 67PAGE10简介OracleServiceBus面对如今变化迅速的市场需求,企业希望:更方便的与客户和合作伙伴交互,更灵活的设计与构建IT的基础架构。为此SOA(ServiceOrientedArchitecture)日益得到企业信息化管理者的重视。SOA将分散在企业应用中的功能组合为基于标准的互操作服务。与传统使用应用相比,企业可利用SOA更快的组合和重用服务,以满足业务需求。SOA围绕服务而不是应用来组织企业的IT,可以帮助企业更快的退出新的服务,并灵活相应业务环境的变化。为优化IT基础结构,以便交付服务,将SOA变成现实,IT组织需要一个智能化的基础架构,以降低服务重用的复杂性,并可靠地集成IT环境的各种技术,协议与应用。为此IT组织创建一个以服务为中心的抽象层,以隐藏各种应用和技术带来的底层复杂性,并提供一个定制企业应用的平台。我们将上述服务或集成层成为ESB(EnterpriseServiceBus)。ESB的优点如下:服务端点本身不必在管理服务之间的交互服务拓展更加方便快捷消除点对点及硬编码实现带来的脆弱性与昂贵代价OracleServiceBus即是一个ESB,用于集成服务,管理服务交互,并在不同IT环境之间执行消息代理。OracleServiceBus是部署和实现SOA的理想工具,支持智能消息代理,监控与管理服务。主要架构概念OracleServiceBus是策略驱动的中阶层,它处理消息,确定如何根据要求路由和转换消息。它通过诸如JMS或HTTP协议的传输协议接收消息,并用相同协议或另一指定传输协议发送消息。消息响应按照相反的方向进行。消息处理由元数据驱动,元数据由OracleServiceBus控制台配置的代理服务的消息流定义指定。使用代理方法,企业可实现服务客户端与业务服务之间的松耦合,并维护一个集中的安全控制和监控点,如图1所示图1使用OracleServiceBus,服务集成关系通过配置策略和代理服务动态实现。在使用这种方法时,可以快速拓展服务架构的某些系统特性传输协议与通信范例服务安全性服务位置服务可用性和响应性数据格式日志记录和监控由于代理服务扮演中间人角色,因此OracleServiceBus能清除以下领域的服务客户端和业务服务需求之家的差别加载内容方式封送协议传输协议点对点和发布-订阅协议单向和请求/响应范例同步和异步通信安全性服务类型与支持协议服务类型传输协议SOAPWSDL或XMLJMS/HTTP(S)SOAP(非WSDL)JMS/HTTP(S)XML(非WSDL)JMS/HTTP(S)/电子邮件/文件/FTP消息传输类型(二进制、文本、MFL、XML)JMS/HTTP(S)/电子邮件/文件/FTP服务生命周期OracleServiceBus是一个服务中介,在整个服务生命周期都扮演者重要角色:公开服务配置管理和监控服务使用者与服务提供者之间的请求-响应消息流图2演示了服务的生命周期。开始阶段:架构师建立服务模型,构建服务开发阶段:开发人员创建和公开应用及服务接口运行管理阶段:监控和管理服务端之间的消息流,系统健康状况及可用性图2JDeveloperJDeveloper是Oracle中间件的一套集成开发工具,综合来说中间件的所有开发都可以在该IDE中完成。可以根据需要在IDE中集成必要的插件来丰富IDE的开发支持性。本节主要描述JDeveloper针对OSB开发所提供的窗口,编辑器以及开发配置向导。OracleServiceBusInJdeveloper如图3展示了OracleServiceBus在Jdeveloper集成开发环境中的开发窗口组成图3ApplicationNavigator在ApplicationNavigator窗口展示了ServiceBus项目所包含的服务(services)、所有资源文件(Allresource)及主要文件。以下为ApplicationNavigator中所能看到的ServiceBus项目包含的文件列表:XML文件:该文件为在项目创建时自动生成。该文件的内容描述了整个ServiceBus应用所包含的服务(service),资源(resource),引用(reference)。在ApplicationNavigator中看到该文件与ServiceBus项目名移植。在文件系统中该文件名为:servicebus.sboverviewProxyservicefiles(service_xy)Businessservicefiles(service_name.bix)Pipelinefiles(pipeline_name.pipeline)Split-joinfiles(splitjoin_name.flow)所有的资源文件:如serviceaccounts,WSDL文件,servicekeyproviders,alertdestinations等等子文件夹,XSD文件(schemas),XSL文件(transformations)ServiceBusOverviewEditor该窗口允许开发人员使用图形化工具以自上而下的方式设置ServiceBus应用。在该窗口你可以使用鼠标从组件窗口拖拽pipelines,split-joins,transports,adapters及bindings至设计窗口。当从组件窗口拖拽相应的组件至设计窗口时会弹出对应的创建向导来指导完成与该组件相关的配置任务。ResourceEditor在ServiceBus的每种资源中都提供其对应的资源配置与编辑窗口。大部分的资源编辑器都存在多个编辑视图。某些编辑窗口中甚至会提供编辑历史视图。ComponentsWindow当ServiceBus的ServiceOverviewEditor,PipelineEditor或者Split-JoinEditor打开时组件窗口就会出现。组件窗口根据打开的ServiceOverviewEditor,PipelineEditor或者Split-JoinEditor列示出了各Editor所能使用的所有组件组件。环境搭建ServiceBus的环境搭建包括两部分:数据库环境搭建开发环境搭建数据库环境搭建OracleServiceBus开发环境使用Oracle数据库。搭建基于windows平台的Oracle数据库网上有很多文档可以参考,本节不在详述数据库搭建的详细步骤。数据库环境搭建完成后,使用DBA账户登录数据库,运行以下语句修改数据库参数altersystemsetsga_target=350Mscope=spfile;altersystemsetsga_max=350Mscope=spfile;altersystemsetprocesses=500scope=spfile;重新启动数据库。开发环境搭建在开始开发环境搭建时默认数据库环境已搭建完成。开发环境的搭建请参考《Oracle12c开发环境搭建.doc》本节不再详述。OSB控件简介MessageFlow管道对(PipelinePair)管道对将一个请求管道和一个相应管道组合到一个顶级元素中。在消息流中,一个管道对节点只能有一个直接子项。在请求处理过程中,当OracleServiceBus处理管道对节点时,只会执行请求管道。在OracleServiceBus处理响应管道时,执行路径正相反。路由(Route)路由节点用于执行与另一个服务之间的请求/响应通信。它表示代理服务的请求处理和响应处理之间的界限。当路由节点调度请求消息后,即认为请求处理完成。当路由节点接收响应消息后,即开始处理消息。路由节点支持条件路由及请求和响应转换。因为路由节点表示请求处理和响应处理之间的界限,所以它在消息流中不能有任何子节点。阶段处理(Stage)可以把Stage当做一个容器,用来存放Action。在一个消息流中,使用一个Stage节点作为处理消息流的一个容器。可以将消息流划分为多个阶段,处理逻辑。错误处理程序(ErrorHandler)错误处理程序提供逻辑重新发送错误消息流。使用错误消息处理程序制定如果在某一个特定位置发生了错误应该返回怎么样的消息流。RouteActions动态路由(DynamicRouting)动态路由基于可用的Xquery数据源提供的路由信息未消息分配路由。这是一个终端Action,即不能再Action后再添加其它Action。但这个action可包含请求和响应action。静态路由(Routing)在路由动作中,使用静态路由可直接指定消息路由至哪一个业务服务,而不是对条件进行判断。同样,静态路由也是一个终端action,在静态路由后不可添加其他的action。路由表(RoutingTable)路由表会指定一组路由并用switch-style条件表将这一组路由包裹起来,然后根据条件的不同确定不同的路由线路。同动态路由和静态路由一样,这也是一个终端action。StageAction动态发布(DynamicPublish)动态发布是根据xquery表达式来确定消息将发布到哪一个业务服务静态发布(Publish)将消息流发布到一个指定的静态服务静态表(PublishTable)对一个消息流,使用发布表的作用是发布消息到零个或多个静态指定的服务。Switch-style条件逻辑是用来确定在运行时哪些服务将用于发布路由选择(RoutingOptions)主要作用是修改的任何或所有下列性质的出站请求:URI,优质的服务,模式,重试参数,消息优先级。服务标注(ServiceCallout)直接调用指定的业务服务,此控件会阻进程,即没有返回值程序不会继续执行。传输报文头(TransportHeaders)主要作用是设置传输报文头的信息ForEach语句遍历一个值序列,并执行一个代码块的ActionIfThen条件语句根据Xquery表达式的boolean值,执行一个操作或一组操作条件错误收集(Raiseerror)主要作用时引发一个异常与指定的错误代码和描述回应(Reply)在消息流中使用此控件指定立即回复给返回给调用者。可用户请求,响应,或者错误的管道。跳过(Skip)使用此控件时,会跳过当前执行的Stage并进行下一Stage的消息处理。这个action没有参数。可用于请求,响应或者错误的管道。再开始(Resume)在一个消息流,将进行错误处理的消息流恢复至正常进行下一步操作。这个action没有参数。只能用在错误管道。分配(Assign)在消息流中使用此控件分配或指定query表达式的上下文变量。删除(Delete)在消息流中删除一个上下文变量或一组节点的指定一个表达式插入(Insert)在消息流中根据Xpath表达式所描述的节点处插入Xquery表达式的结果Java(JavaCallout)在消息流管道直接调用java方法。此控件调用的Java方法必须是静态的MFLTransform(MFL转换)在消息流管道中实现非XML和XML消息流的互转重命名(Rename)将消息流中根据Xpath查询出来没有修改过内容的节点重命名替换(Replace)此控件由指定的Xpath表达式取代一个节点或节点内容。这些节点或节点内容取而代之的是Xquery表达式的返回值。验证(Validate)此控件根据xpath表达式针对XML架构元素或WSDL资源文件进行验证警告(Alert)在消息流中,警告操作会在管道中的消息上下文的基础上生成警报。所产生的警报操作的通知与SLA警报,主要用于商业目的或报告错误。不监控系统运行状况。警报目标应该考虑到这一点的配置选择。生成的警报在控制台可查看。日志(Log)打印日志文件。日志文件会存放在服务器上。报告(Report)使用此控件时会将代理服务所生成的报告存入数据库。为方式数据库文件及数据库日志文件暴增,慎用报告。小结本章简要介绍了OSB中常用组件,对于本章内容的详细讲解可参见:<DevelopingServiceswithOracleServiceBus-E28532-03>的PartIII12ModelingMessageFlowinOracleServiceBus--PipelineComponents一节。集成规范集成方式各种集成方式的使用场景JMS消息:集成异步应用系统WebService/Restfull:集成任何提供Webservice技术的异构系统文件/FTP/SFTP/Email:松耦合集成完全封闭的私有系统JDBC:直接集成数据库中的数据MQ/TibcoEM:集成第三方专用软件Tuxedo:集成Tuxedo开发的应用集成方式选择集成方式选择时,应充分考虑以下集成点:1.集成系统接口传输数据量小于1M的,考虑WebService;数据量在1M-10M之间的,考虑ETL工具;数据量在10M以上的,优先考虑OGG,其次考虑文件传输2.系统集成优先考虑提供WebService/Restful进行集成;其次考虑数据库层面进行集成;最后考虑其它集成方式3.集成系统优先考虑实时集成,其次考虑定期轮询4.集成系统接口数据量大,实时性要求高时,ESB直接穿透,不进行数据转换5.多个系统关心同一数据,发布消息数据量较小时,可采用ESB进行异步发布订阅。对于发布消息数据量较大且多个系统关系该数据的情况,建议通过ETL进行数据同步6.集成系统接口数据量小,定时同步的情况,统一通过ESS进行调度数据类型约定系统间接口交互时,为避免因数据格式产生的不兼容性,基本数据类型统一为字符型和数字型两种。对于日期型的数据,采用日期型的数据,采用字符型统一处理,统一日期格式为:“YYYY-MM-DDHH24:MM:SS”,例如“2015-01-0120:00:00”,日期格式的处理由各业务系统自行实现。开发简介在阅读OSB开发实例前应该具备的知识命名空间XML/XHTMLXPathXQueryWSDL在进行开发示例前,我们先来明确两个服务:代理服务,业务服务代理服务(ProxyService):由OSB定义并实现的对外发布的服务Web服务供服务消费方调用。业务服务(BusinessService):外围系统定义并实现一定业务功能的的Web服务,业务服务开发时需要服务提供方提供必要的WSDL文件或者PLSQL/TABLE/VIEW等对象才可以开始开发。代理服务与业务服务调用关系如下图所示:从图中可以看出,服务使用者调用ServiceBus上发布的代理服务,由代理服务将消息流传送至业务服务并将业务服务处理的结果消息流传送给服务使用者。OSB提供了很多类型的BusinessService可用来实现不同协议之间的消息传输与服务调用,从开发中的分类来讲主要分两大类:Adapter,Transport从实现目的来看Adapter与Transport都是为外围系统将服务接入OSB而提供的一种接入服务方式。从Adapter与Transport实现外围系统业务接入OSB的方式来看:Adapter偏向于数据库对象,数据库编程及各种基于传输协议所提供的外围系统服务接入Transport偏向于使用流行的应用开发方式所提供的WSDL接入等服务的接入方式,即应用层开发的业务服务的接入服务。开发示例中从Adapter和Transport创建OSB服务的两个方向分开讲解。MessageContext在第5节中我们看到,在osb中,数据是以消息流的形式传输,消息上下文是一组使用xmlschema定义的xml结构数据。在osb的pipeline中使用XQuery表达式来管理消息上下文变量。预定义上下文变量预定义变量可以分为:消息相关变量,入站和出站变量,操作变量,错误变量各变量。下表简要描述了预定义上下文变量。上下文变量说明分类headerForSOAPmessages,$headercontainstheSOAPheader.IfthepipelineisSOAP1.2,$headercontainsaSOAP1.2Headerelement.FormessagetypesotherthanSOAP,$headercontainsanemptySOAPheaderelement.消息相关bodyThisvariesdependingonthemessagetype,asdescribedbelow:•SOAPmessages:The<SOAP:Body>partextractedfromtheSOAPenvelope.IfthepipelineisSOAP1.2,the$bodyvariablecontainsaSOAP1.2Bodyelement.•Non-SOAP,non-binarymessages:Theentiremessagecontentwrappedina<SOAP:Body>element.•Binarymessages:A<SOAP:Body>wrappedreferencetoanin-memorycopyofthebinarymessage.•Javaobjects:A<SOAP:Body>wrappedreferencetoanin-memorycopyoftheJavaobject.消息相关attachmentTheMIMEattachmentsforagivenmessage消息相关inboundTheinboundtransportheadersalongwithinformationabouttheproxyservicethatreceivedamessage.入站和出站变量outboundTheoutboundtransportheadersalongwithinformationaboutthetargetservicetowhichamessageistobesent入站和出站变量operationTheoperationbeinginvokedonapipeline操作变量faultInformationabouterrorsthathaveoccurredduringtheprocessingofamessage.错误变量messageIdThetransportprovider-specificmessageidentifier.ThisIDshoulduniquelyidentifythemessageamongothermessagesgoingthroughtheServiceBusruntime消息唯一标志消息的预定义变量对我们了解与熟悉osb运行非常有用,此部分内容标准文档讲述的非常详细,请参考<DevelopingServiceswithOracleServiceBus-E28532-03>的PartX-AMessageContextAdapter前面已经讲过Adapter偏向于数据库对象,数据库编程及各种基于传输协议所提供的外围服务接入。本节将针对基于数据库对象,数据库编程及基于传输协议所提供的外围服务的接入方式进行开发示例说明DatabaseObjects基于数据库对象的服务接入相对来说比较简单且在知道被接入系统数据库连接信息及表或视图的情况下,不需要被接入系统提供协助即可完成。在使用基于数据库对象的服务接入方式前需要创建被接入系统数据库的数据源及DBAdapter。创建数据源数据源为Weblogic使用jdbc连接数据库的连接配置。在配置数据源前需要得到如下信息:数据库服务器IP地址数据库服务端口数据库连接用户名/密码在这里以创建至Oracle数据库的数据源为例来讲解数据源的创建过程登录WeblogicConsole进入数据源界面在登录成功后进入的首页中,可以在右侧的服务区域中点击“数据源”或在左侧点击服务->数据源进入数据源界面创建数据源JDBC数据源概要->配置点击新建下拉按钮,选择一般数据源,进入数据源新建界面新建JDBC数据源名称:数据源的名称,命名规则为系统+用户+DSJNDI名称:命名规则为jdbc/数据源名称数据库类型:选择Oracle点击下一步选择数据库驱动关于数据库的驱动程序,详情请参加附录1这里选择Oracle’sDrives(ThinXA)forInstanceConnects;VersionsAny点击下一步事务处理选项由于数据库驱动选选择的是XAJDBC驱动,所以直接Next数据库连接属性数据库名称:即数据库的名或数据库实例名主机名:数据库服务器的IP地址或主机名端口:数据库监听端口数据库用户名:数据库登录用户名口令/确定口令:数据库登录用户对应登录口令其它链接属性:留空点击Next数据源配置概要该界面展示了前面配置数据源的信息概要,在该界面可以测试数据源连接是否Ok,如数据源连接配置无误,则会显示:连接测试成功。点击Next,否则按照提示查找问题,直到连接测试成功。部署数据源将创建的数据源部署到ManagerServer或者ManagedServer,勾选对应的Server,点击完成。由于我们是使用JDEV集成的Weblogic,所以这里勾选DefaultServer。点击完成。创建DBAdapterDBAdapter是对数据源的引用。在开发数据库对象的服务接入时,DBAdapter为本地开发环境服务器与服务器环境进行数据匹配的唯一依据。Oracle在这里引入DBAdapter的目的应该有一下两点:实现分级模块化管理使DBAdapter连接信息变更灵活登录WeblogicConsole进入DbAdapter设置界面点击左侧“部署”,在右侧界面点击定制此表,将每页上显示的行数设置为:1000,在部署区域找到DbAdapter,点击进入DbAdapter配置界面进入出站连接池界面配置->出站连接池点击新建新建出站连接选中javax.resource.cci.ConnectionFactory,点击下一步配置JNDI名称JNDI名称:命令规则为eis/DB/数据源名称点击完成查找JNDI出站连接配置查找到前面配置的JNDI出站连接,点击进入该JNDI出站连接的属性界面更改JNDI出站连接属性由于前面创建的数据源为XAJDBC,所以修改XADataSourceName属性值为jdbc/EBSAppsDS,其它保留默认,点击保存更新DbAdapter点击左侧导航栏的部署,找到DbAdapter勾选,点击更新按钮,进入更新应用程序辅助程序界面更新应用程序辅助程序保留默认,点击下一步,完成基于Table或View的OSB开发创建ServiceBusApplication在Jdeveloper中支持两种方式创建ServiceBusApplication方式一:仅创建ServiceBusApplication方式二:创建ServiceBusApplication同时在创建一个ServiceBusApplication使用方式一创建后,可以再后续的步骤中再创建ServiceBusProject这里采用方式一:先创建ServiceApplication,在创建ServiceBusProject在Jdeveloper的applicationBrowser中点击右侧的下拉按钮,选择New->Application弹出Application新建窗口在NewGallery中,Categories选择Application,在Items中选择ServiceBusApplication,点击Ok进入CreateServiceBusApplication创建向导界面ApplicationName:命名规范为XxxxSBAppDirectory:ServiceBusApp的本地存储路径,默认为Jdev工作空间路径ApplicationPackagePrefix:留空点击Finish完成ServiceBusApplication创建创建ServiceBusProject在Jdeveloper的applicationBrowser中点击右侧的下拉按钮,选择New->Project弹出Project新建窗口在NewGallery中,Categories选择Projects,在Items中选择ServiceBusProject,点击Ok进入CreateServiceBusProjects创建向导界面ProjectName:命名规范为:XxxxSB其它保留默认,点击Finish完成ServiceProject的创建在创建完成的Project中建立以下目录目录名作用备注BusinessServicesPipelinesProxyServicesResourcesSchemasTransformationsWSDLs创建完目录的ServiceProject如下双击DemoSB,打开ServiceBusViewEditor创建基于数据表或视图的BusinessService从Component窗栏点击Technology下的Database组件,拖拽至ExternalServices后弹出OracleDatabaseAdapterConfigurationWizard向导窗口Name:BusinessService名称,命名规范为:<封装的服务名称>BS点击NextServiceConnection在该界面选择要创建的视图或表来自于那个数据库,如没有创建至对应数据库的连接,点击号进行创建在CreateDatabaseConnection界面ConnectionName:命名规则与Weblogic中数据源名称保持一致,填写完数据库的其它信息后点击TestConnection按钮,如连接成功,点击Ok,否则检查问题原因直至TestConnection成功。点击Ok后退回至ServiceConnection界面,默认选择前面创建的Connection,JNDIName为自动生成,该JNDIName必须与WeblogicDbAdapter的名称一致,这就是为什么ConnectionName要和数据源名称保持一致的原因。点击NextOperationType进入OperationType选择界面,本节是创建基于表或视图的BusinessService,OperationType选择PerformanOperationOnaTable仅保留Select的勾选,点击NextSelectTable点击ImportTables按钮在ImportTables界面中Schemas选择要创建的数据表或视图所在的schema,这里选择Scott,点击Query按钮,选择EMP表至右侧的Seleted列表,点击Ok退回SelectTable界面,点击NextRelationships点击NextAttributeFiltering选择需要的表或视图字段点击NextDefineSelectionCriteria定义select筛选条件点击Parameter后的Add按钮添加对表或视图的查询条件,这里添加针对empNo和hireDate的筛选参数点击Add,输入参数名称p_emp_no,点击Ok点击Add,输入参数名称p_hire_date_fr,点击Ok点击Add,输入参数名称p_hire_date_to,点击Ok将创建的参数作为条件添加到Sql中点击Edit按钮,进入ExpressionBuilder向导点击Add添加一个And条件,点击Edit选择数据表或视图字段,选择合适的Operator,SecondArgument选中Parameter选择对应的筛选参数,完成一个条件的添加按照方法完成其它Parameter条件的添加,点击Ok按钮该向导只是初步帮助完成了SQL条件的添加,加入参数都是允许为空,则需要手工修改SQL脚本内容,修改完成后一路Next至Finish创建完成后界面如下,此时你可能注意到有需要带有错误标志的文件,此时不要惊慌,Refresh下Project即可,保存按照下表将文件移入对应文件夹注:Jdeveloper中移动文件是不能直接进行拖拽,单击选中需要移动的文件,右键,选择Refactor->Move,在弹出的窗口选择需要移动至的文件夹,点击Ok即可文件名目标文件夹说明HrEmployeeQueryBS_table.xsdSchemasHrEmployeeQueryBS.wsdlHrEmployeeQueryBS-concrete.wsdlWSDLsHrEmployeeQueryBS.bixBusinessServices至此,基于数据库表或视图的BusinessServices已经创建完成。如有兴趣可以研究本步骤创建的所有文件内容,以进一步了解基于数据库表或视图的BusinessServiceBusinessService测试在ServiceBusViewEdit窗口,选择需要测试测试的BusinessService,右键,选择Run删除默认的所有参数值,点击Execute出现如下面界面表示BusinessService成功运行ProxyService创建复制HrEmployeeQueryBS_table.xsd,并修改参数Type在Schemas目录中复制HrEmployeeQueryBS_table.xsd并重命名为HrEmployeeQueryBS.xsd双击打开HrEmployeeQueryBS.xsd文件修改命名空间将HrEmployeeQueryBS修改为HrEmployeeQuery修改pHireDateFr与pHireDateTo及HireDate的类型为xs:string创建Pipeline在ServiceBusViewEditor的Pipelines/SplitJoins中右击鼠标,选择PipelineCreatePipelineServiceServiceName:命名规则<服务名称>PP其它保留默认点击NextTypeServiceType:选择WSDL,点击CreateWSDL按钮InterfaceType选择SynchronousInterface添加input和OutputInputOutput返回CreateWSDL界面,点击Ok,返回CreatePipelineService的Type界面,点击

Finish按钮完成Pipeline的创建,保存所有按照下表将对应文件移动至对应文件夹文件名称目标文件夹说明HrEmployeeQueryPP.pipelinePipelinesHrEmployeeQueryPP.wsdlWSDLsHrEmployeeQueryPS.proxyProxyService创建xqy转换文件是否需要创建转换文件,是根据代理服务传入或传输的数据类型是否与外围系统的数据格式存在不一致。如本例中,在创建基于数据库表的BusinessService时,输入参数存在日期型,而根据集成规范,是不允许存在存在日期类型数据的。但本例中需要根据日期类型进行数据筛选,为遵守集成规范的约定,我们需要将服务使用者传入的YYYY-MM-DDHH24:MM:SS字符串的格式转换为日期格式。同样在输出的时候,需要将日期型字段的转换为YYYY-MM-DDHH24:MM:SS的格式传送,所以在这里需要创建转换文件进行转换。创建Request中参数转换文件在ApplicationBrowser选中Transformations右键New->XQueryFilever1.0创建完成后进入xqy文件编辑窗口按照如图将input中的Source与Target进行拖拽连接,注意string到dateTime的转换,编写完转换函数后需要点击左侧的向上图标将函数转换关系放上去。注:本例的三个参数都为非必须参数,对于使用了转换函数的参数需要做特殊处理,进入XQuerySource窗口,按下图所示修改XQuery文件修改源文件完成后xqy的mapper如下图所示创建Response中参数转换文件在ApplicationBrowser选中Transformations右键New->XQueryFilever1.0创建完成后进入xqy文件编辑窗口按照如图将input中的Source与Target进行拖拽连接,注意dateTime到string的转换,编写完转换函数后需要点击左侧的向上图标将函数转换关系放上去。编排Pipeline进入ServiceBusViewEditor,在Pipelines/SplitJoins中双击HrEmmployeeQueryPP图标进入Pipeline编排编辑器添加PipelinePair至PipelineHrEmmployeeQueryPP添加ServiceCallout至PipelinPairNode1->RequestPipeline的Stage1中,并设置新添加的ServiceCallout的ServiceCallout属性为HrEmployeeQueryBS添加Assign至ServiceCallout的RequestAction节点,value选择XQueryResource,variable:request添加Assign至ServiceCallout的ResponseAction节点,Value选择Expression,variable:bodytemp添加Assign至ServiceCallout的ResponseAction节点,Value选择Expression,variable:body。该Assign的作用是将查询结果以soapbody的形式返回给服务使用者回到ServiceBusViewEditor界面,看到编排后的结果如下测试使用JDEV测试在ServiceBusViewEditor中选中HrEmployeeQueryPS或者HrEEmployeeQueryPP,点击右键选择RUN,JDEV默认会将将DemoSB项目发布到集成的weblogic上并跳出测试界面测试场景1:参数全部为空测试场景2pEmpNo:7369其它参数留空测试场景3pHireDateFr:1980-01-0100:00:00pHireDateTo:1981-01-0100:00:00其它参数留空服务器部署在前面的步骤中我们完成了第一个DemoOSB项目的开发,但所有的运行环境都在本地,在本次测试无误后,需要将我们开发的内容发布到服务器上供服务使用者调用。在中间件部署中都是以项目为发布单元,Application仅是作为开发管理的一个结构而存在。在ApplicationBrowser中选中需要发布的项目点击右键导出项目为Jar文件选择Export,在弹出的导出向导界面选择ServiceBusResource,点击OkType保留默认,点击Next确认要导出的项目已被勾选,选择需要导出到的路径并对将要导出的jar命名,建议jar的命名与项目名称一致,点击Finish完成导出进入osb控制台,点击创建来创建一个会话点击左侧导入图标,在文件选择窗口选择刚才导出的jar文件,点击下一步按钮在该界面确认要导入的内容,无误时点击导入按钮导入完成后出现导入结果信息界面,若该界面出现错误提示信息,则需要检查,否则点击关闭完成导入点击激活完成导入OSB项目发布成功后会有提供一个URL路径供调用,该路径的可以在OSB控制台点击对应的项目列表的ProxyServices目录,如下图则刚才发布的OSB项目的访问URL为:http://host:sbport/URI?wsdl注:host为OSB服务器所在的服务器Sbport为OSB服务所监听的端口,可在WeblogicConsole的环境->服务器中查看URI为ServiceBusConsole中对应项目的传输URI?wsd为固定值基于Table或View的OSB开发小结在6.1.3节中详细描述了通过Table或View来创建OSB项目来发布服务供服务使用者调用,那么有以下两个问题需要考虑:基于Table创建BusinessService是可以选择InsertOrUpdateTable/InsertOnly那么是否可以选择InsertOrUpdate/InsertOnly来对外围系统的表进行操作呢,答案是:理论上是可行的,但实际项目中强烈建议不要这么做,因为OSB是作为服务中介,并非服务提供商。在6.1.3中是基于联系进行而创建的项目,目录结构虽然看上去分配还比较合理,各类型文件也区分的比较明细,那么实际项目中该目录结构是否也适用呢对于初学者来说可能比较疑疑惑,但是当你做完6.1.3中的例子后,就会发现该目录结构完全不能符合实际项目开发需要。因为BusinessService和ProxyService混在一起,比较难区分,交接成本高,维护成本高。实际项目开发中会针对业务域进行分组,以业务域为创建项目的基本元素,项目下再根据系统创建文件夹,系统文件夹下,创建对应的业务对象,业务对象文件夹下才是我们6.1.3节中创建的7个子目录。这么样的目录结构会让各外围系统的BusinessService与ProxyService结构比较清晰。对后期的交接与维护都比较容易。但这样的目录也存在一定的问题:业务域下会有很多系统与业务对象集成需要开发,则需要多人共同协作,这样的目录结构稍不注意就会引起程序版本冲突。项目的开发视图需要专人来维护,避免该文件冲突项目中第二种建立项目的方式是以接口为维护建立项目,例如EBSCOA账户段同步费控系统,这样的接口即单独建立一个项目,项目下再建立系统文件夹,系统文件夹下再建立7个子目录。这样的方式是将项目拆分的更细,从而较少了程序版本文件冲突的发生。也具有较高的可交接性与可维护性,但同时Application中创建的项目数量也会成倍增加。6.1.3节的例子按照第二种方式目录结构,创建的目录结果如下具体使用第一种还是第二种方式用作实际项目的目录结果,根据项目具体情况确定。DatabasePrograms本节将详细讲述基于Oracle数据库存储过程发布BusinessService,再将BusinessService封装成ProxyService供服务使用者调用。在基于Oracle数据库存储过程创建BusinessService前,若没有创建至对应数据库的数据源及DBadapter,则需要先创建数据源及DBadapter。数据源与DBadapter的创建可以参见6.1.1和6.1.2。本例中还是以从scott.emp表中获取信息为例进行讲解。业务场景:根据员工编号,雇佣日期从,雇佣日期至三个参数对员工数据进行筛选,三个参数为或关系,查找到的员工信息返回:员工编号,员工姓名,职位,主管上级,部门名称,部门位置。开发数据库存储过程New->Program->PackageCUX_SCOTT_EMP_QUERY.PKG在程序包头定义包含员工编号,员工姓名,职位,主管上级,部门名称,部门位置属性的RecordType和TableType开发根据参数获取员工信息存储过程创建基于数据库存储过程的BusinessService在DemoApp下新建项目DemoProcedureSB,双击DemoProcedureSB打开ServiceBusViewEditor编辑窗口从ComponentBrowser中选中Database组件拖拽至ExternalService栏,在弹出的DatabaseAdapter配置向导的Welcome界面输入BusinessService名称DemoProcedureBS,点击Next在ServiceConnection中选择或创建正确的数据库连接,确保JNDIName与服务器的DbAdapter中配置的一致,点击NextOperationType选择CallaStoredProcedureorFunction,点击NextSpecifyStoredProcedureSchema:APPSProcedure:CUX_SCOTT_EMP_QUERY.GET_EMP_INFO注:Procedure必须大写,否则会找不到对应的Procedure,也可以点击Browser对进行筛选,为加快速度这里选择直接输入,点击NextJDeveloper会自动查询找出对应存储过程的参数及用到的Type类型变量,一路Next至Finish向导执行结束后会生成8个文件,这8个文件的说明如下表文件名作用BPEL_DEMOPROCEDUREBS_drop.sqlPlsql中创建的Record和Table类型创建为数据库对象Drop脚本及存储过程删除脚本BPEL_DEMOPROCEDUREBS.sqlPlsql中创建的Record和Table类型创建为数据库对象创建脚本DemoProcedureBS_db.jca保存数据源与JNDI配置信息DemoProcedureBS_sp.xsd保存数据格式定义DemoProcedureBS.wsdl服务定义DemoProcedureBS-concrete.wsdl服务定义DemoProcedureBS.bixBusinessService按照6.1.4中描述的第二种文件结构整理后,该项目的目录机构为注:图中已把不需要的目录删除,实际项目中可以根据需要将7个目录中不需要的目录删除。创建ProxyService双击DemoProcedureSB打开ServiceBusViewEditor编辑窗口,在ProxyServices栏中点击鼠标右键->InsertTransports->HTTPCreateServices在弹出的Service创建向导中根据下图红框中的值,点击NextType按照如图所示选择刚才创建Service时创建的wsdl文件,点击Ok,一路Next至Finish创建完成后ApplicationBrowser与ServiceBusViewEditor为使用refactor功能将DemoProcedurePP.pipeline文件移动至../Pipelines文件夹编排Pipeline在ServiceBusViewEditor中双击Pipeline/SplitJoin栏中的DemoProcedurePP.pipeline文件进入Pipeline图形编辑器添加Routing组件至PipelineDemoProcedurePP点击Routing节点,修改Routing属性返回ServiceBusViewEditor,编排后的如下右击ProxyServices下的DemoProcedurePS,选择run进入代理服务测试页面,清除所有参数值,点击Execute执行调用结果如下这里出现了错误,在这里首先可以确认的是数据源没有问题,在6.1.3中的实例已经完成且没有问题。根据错误信息在support上查到如下问题UnabletoinvokeastoredprocedurewiththeDBAdapterinSOA12c(ID2017647.1)根据support上的提示,需要将jca文件中的packageName及ProcedureName对应的属性值替换为BPEL_DEMOPROCEDUREBS.sql中对应的程序包及该程序包下的存储过程。修改前修改后返回ServiceBusViewEditor,右击ProxyServices下的DemoProcedurePS,选择run,进入代理服务测试页面,清除所有参数值,点击Execute测试场景一:P_emp_no:7369P_hiredate_fr:P_hiredate_to:测试场景二:P_emp_no:P_hiredate_fr:1980-01-0100:00:00P_hire_date_to:1981-01-0100:00:00基于DatabasePrograms的osbservice开发小结开发完基于DatabasePrograms的osbservice实例,可以发现,在本例中我们没有像基于DatabaseObject的实例那样建立xquery文件来进行数据类型转换取数的字段逻辑也相应的复杂了很多,但是并没有增加开发难度,相反无论从DatabaseProgram的开发还是服务的编排上都简单了很多。所有的数据类型转换及增加表关联字段都是在DatabaseProgram中完成。在本例中osbservice真正仅做了一回代理角色。将基于DatabaseObjects的osbservice开发过程与基于DatabaseProgram的osb开发过程及实现逻辑的复杂度及实现的难易度来看,基于DatabaseProgram的osb开发要明显的优于基于DatabaseObjects,尤其在数据类型转换及复杂表关联字段取值及特殊参数处理逻辑上,基于DatabaseProgram的osb开发方式更加快捷方便。因此在进行DBAdapter的BusinessService开发时优先考虑使用基于DatabaseProgram的方式,其次才是基于DatabaseObjects,对基于DatabaseObjects且存在复杂关联字段取值时优先考虑采用视图,而不是import多张table在osb中进行sql关联处理。AppAdapterAppAdapter故名思议,就是连接应用的适配器。AppAdapter与DBAdapter最大的不同我认为有以下方面:触发方式的不同:DBAdapter生成的WSDL需要由第三方系统调用属被动调用;AppAdapter由EBS本身自行触发属主动调用数据同步方式不同:DBAdapter为sync(同步)方式,若调用恰当可认为是实时同步;AppAdapter为unsync(异步)方式,数据先进入队列然后再触发至外围系统。OracleAppsAdapterOSB12C中目前至此的应用适配器主要为SAP应用,Oracle应用,JDEWorld本节以连接Oracle应用的适配器为例进行说明。与Oracle应用集成目前最为常用的就是与OracleE-BusinessSuite(EBS)集成。使用EBS中的BusinessEvent(业务事件)是目前与EBS集成最为常用的做法。业务事件包括系统预定义业务事件和自定义业务事件,常用的业务事件有Create和Update事件。Create事件用于对象数据新增时触发同步使用Update事件用户对象数据发生变更时使用(EBS数据管理严格,一般传出的数据不存在删除逻辑,对于已产生的数据仅作失效处理即更新)采用基于businessevent的异步增量数据集成方式,优点在于可靠地传输保证,同时能保证大量事务集成时不会丢失数据,缺点在于系统间的事务不是同时完成,如果集成程序出现错误,会导致两边数据不一致,需要管理员介入进行处理。EBS业务事件集成的运行原理如下图所示上图的第一条线路,由EBS对应业务事件出发时自动发起。SOA监听业务事件,然后直接获取业务事件中<EVENT_DATA></EVENTDATA>中的值,或者根据业务事件的<EVENT_KEY></EVENT_KEY>值调用EBS提供的DatabaseProgram业务服务获取详细数据,之后OSB调用相应的第三方系统提供的代理服务将获取到的<EVENT_DATA></EVENT_DATA>或详细输入作为输入由第三方系统进行处理。整个过程都是自动进行,没有人工介入。由于是异步方式,如果App端没有执行成功造成两边数据不一致,需要管理员找出故障后,重试服务以达到来重新传送数据使两边系统数据保持一致。OracleAppsAdapter业务事件相关表前面已经讲过OSB是服务中间,所以此处提到的表,应该自然而然的是EBS中的表。哈哈业务事件定义相关表表名说明wf_events业务事件定义存储表wf_agents业务事件代理信息存储表,将业务事件在jdev的osb项目中生成代理服务后,自动生成数据至该表wf_event_subscriptions业务事件对应的订阅定义存储表,将业务事件在jdev的osb项目中生成代理服务后,自动生成数据至该表以上与OracleAppAdapter相关的业务事件表之间的关联关系如下表主表从表关联关系wf_eventswf_event_subscriptionswf_events.guid=wf_event_subscriptions.event_filter_guidwf_event_subscriptionswf_agentswf_agents.guid=wf_event_subscriptions.out_agent_guid业务事件运行相关表表名说明WF_DEFERRED当业务事件被触发后,该表中会对应的产生一条该事件对应的记录,可使用下面sql查看最近触发的某个事件记录,表中状态字段state,0ready,1waite,2succeed,3exceptionSelect*Fromwf_deferredwfWherewf.corrid=‘<event_name>’Andwf.user_data.send_date>sysdate-0.1;WF_BPEL_QTAB事件订阅队列表,创建OracleAppAdapter是创建,对应的队列名称为WF_BPEL_Q,多个订阅者订阅同一个事件时该表会产生对应的多条记录OracleAppAdapter实例创建EBS业务事件前面已经讲过OracleAppAdapter是通过EBS的业务事件实现,业务事件中有系统预定义业务事件,自定义业务事件。这里以自定义业务事件为例进行说明。预定义业务事件触发时点相对固定,不易修改,而实际需求比较多样且多变,不如自定义业务事件可灵活定义触发时点。如何使用还需要根据实际情况选择。这里仅讲解如何创建业务事件,业务事件详细内容请参见EBS相关开发文档。以sysadmin登录EBS(注:必须使用该用户,否则不能创建业务事件)路径:SystemAdministrator->workflow->AdministratorWorkflow->BusinessEvent点击Create按钮,创建业务事件oracle.apps.cux.txn.test查找创建的业务事件注意此处不需要为该事件创建订阅,EBS中业务事件的创建到这里就结束了,是不是很简单,^_^在Weblogicconsole中AppAdapter适配器登录weblogicConsole在结构域导航栏中选择部署,定制此表,选择每页显示行数1000,点击应用在部署中查找OracleAppsAdapter点击进入OracleAppAdapter,选择配置->出站连接池,点击新建按钮来创建AppAdapter创建AppAdapter,JNDI名称为:eis/Apps/ebsConn,点击完成更新新建的AppAdapter在OracleAppAdapter中查找新建的AppAdapter点击AppAdapter名称进入更新,将属性XADatasourceName属性值更新为在7.1.1节中创建的数据源名称,保存更新部署在部署页面勾选OracleAppAdapter,点击更新按钮创建基于业务事件的AppAdapter代理服务思考问题:此处为什么是代理服务?打开Jdev,在DemoSBApp应用中新建DemoAppAdapterSB项目双击项目下DemoAppAdapterSB文件打开ServiceBusViewEditor在ProxyService栏点击右键,选择InsertAdapter->Oracle根据创建Oracle创建向导,完成OracleAppAdapter创建IREP是用来加快对Oracle业务事件的游览和搜索,如之前为创建过此处点击Yes,否则点击No,整个创建过程在后台运行创建完成后所生成的文件如下此处的报错是因为该代理服务没有对应的Pipeline按照之前将的目录结果,将对应文件分配到对应目录后结果如下对于创建出来的相应文件可以仔细研究,7.3.2节中定义相关表就是从生成的Sql文件中研究出来的。创建完成后以sysadmin登录ebs查看前面创建的业务事件,发现该业务事件下已自动生成了一个订阅,具体生成原理可以研究创建出来的XX_BPEL_WFEVENT_DemoAppAdapterPs.sql文件。注:上图为订阅的详细内容,注意该订阅的阶段属性值及其下的说明,经过实际运行得出如下结论:当阶段在1-99之间时,前面讲到的运行时表中,队列数据不经过WF_DERERRED表而直接进入WF_BPEL_QTAB表,否则队列数据经过WF_DERERRED后再进入WF_BPEL_QTAB表。创建Pipeline在Pipeline/SplitJoins点击右键根据弹出的Pipeline创建向导,完成Pipeline的创建点击Finish完成创建。建立Proxy和Pipeline之间的Relation在OSBServiceViewEditor中选中ProxyService中的箭头拖拽至Pipeline中的箭头即可完成Proxy和Pipeline之间的关联,建立完成Proxy和Pipeline之间关联后的截图如下验证businessevent与osbproxyservice的连通性双击DemoAppAdapterPPPipeline进入Pipeline编辑界面按照下图编排,此处这样编排的目的是为查看业务事件触发后,DemoAppAdapter所接收到数据将DemoAppAdapterSB项目发布至Jdev集成的weblogic中如下图,选中DemoAppAdapterSb项目的DemoAppAdapterPxy代理服务,右键->Run部署成功后得到如下界面注意:此处是要监控从EBS的业务事件触发OSB的Proxy,所以不需要执行,而是要将log窗口放至最大,并清空log窗口的内容即可。验证EBS业务事件与OSBProxy的连通性使用plsqldeveloper以apps用户登录数据库,新建sql创建编辑下面plsql段来触发EBS业务事件执行完成该plsql段后注意查看Jdevlog窗口的日志输出,如下图所示则表示EBS业务事件与OSBProxy连通成功注:业务事件运行相关表WF_DERERRED与WF_BPEL_QTAB表数据变化请自行观察,此处不做详解。开发外围系统webservice对接EBS业务事件生成的Proxy此处开发基于存储过程的业务服务,该业务服务接收DemoAppAdapterPs代理服务的Request中EVENT_DATA中的内容,并将接收到的EVENT_DATA中内容存入数据表hmw_app_proxy_tests。修改APPS_NE_WF_EVENT_T_DemoAppAdapterPs.xsd文件基于前面日志中看到的EVENT_DATA内容,添加USER_INFO_TYPE元素双击打开APPS_NE_WF_EVENT_T_DemoAppAdapterPs.xsdSchema文件,点击SourceTab页,在前添加USER_INFO_TYPE复杂类型,元素代码如下修改WF_EVENT_T下的EVENT_DATA元素连接至外围Oracle数据库,开发接收数据存储过程使用plsqldeveloper登录外围Oracle数据,创建数据库表hmw_app_proxy_tests开发hmw_app_proxy_test_pub.receive_app_proxy程序包下的存储过程PackageSpecialPackageBody将hmw_app_proxy_test_pub.receive_app_proxy创建为OSB的BusinessService创建至外围Oracle数据的数据源jdbc/hmwXADBConn,创建数据源参见7.1.1节数据源创建创建至外围系统的DBAdaptereis/DB/hmwXADBConn,DBAdapter创建参见7.1.2节DBAdapter创建过程将hmw_app_proxy_test_pub.receive_app_proxy创建为基于数据库的BusinessService,具体创建过程参见7.2.2节。创建完成后截图如下将DemoHmwUserBS封装成代理服务Pipeline编排如下编排DemoAppAdapterPPPipeline调用DemoHmwUserPS将Oracle业务事件触发的数据同步至表hmw_app_proxy_tests中建立xqy文件将BusinessEvent中EVENT_DATA中的内容转换成DemoHmwUserPS的请求内容,创建好的DemoAppToHmw.xqy文件如下图。编排DemoAppAdapterPPPipeline调用DemoHmwUserPS在DemoAppAdapterPP的Stage1中添加ServiceCalloutServiceCallout属性设置如下在ServiceCallout的RequestAction中添加Assign,设置Assign如下在ServiceCallout的ResponseAction中添加Assign,设置Assign如下编排完成后的DemoAppAdapterPPPipeline如下图编排完成后在ServiceBusOverViewEditor中显示如下部署DemoAppAdapterPs,触发EBS业务事件,查看运行结果部署完成后,清空日志窗口以hmw用户登录hmw数据库,查询表hmw_app_proxy_tests中数据以apps用户登录EBS数据库,新建sql窗口,使用如下脚本触发oracle.apps.cux.txn.test业务事件关注jdev日志窗口捕捉到上面触发的业务事件后输出如下在hmw数据库表hmw_app_proxy_tests查找同步的数据,结果如下到这里证明我们开发的EBS业务事件与第三提供的业务服务以已经正确集成。OracleAppAdapter小结从上面的例子可以看出,基于OracleEBS业务事件同步数据时,数据同步的主动权在OracleEBS中,且OracleEBS的开发也相对简单,主要包含两步:使用sy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论