OSB学习(对于组件的研究)
- 1、Nodes(节点)
- 2、Route(路由)
- 3、Communication(通讯)
- 4、Flow Control(流程控制)
- 5、Message Processing(消息处理)
- 6、Reporting(报告)
- ——————————————文章版本更新日志———————————————
1、Nodes(节点)
可以看到整个节点部分一共有七个,我们来挨个看一下表示的是什么意思
1.1、RouteNode(路由节点)
可以看到,这个组件里面设置说很简单的,只有一个节点名称,和描述,这个是用来放路由的,也就是Route,且里面只能放route里面的组件
从名字我们也可以看出来,这个确实就是路由专用的节点组件
1.2、PipelinePair Node(管道对节点)
从名字可以看出来,这个节点是用来放管道对的,有请求也有响应,里面可以放大多数的组件,且创建的时候会自带两个stage(阶段)节点,stage节点会在下一个解释。
大部分的节点的设置页面都是有一个名称和一个描述来写的,后面的我就不过多展示了哦。
1.3、Stage(阶段)
这个组件是用来存放多个阶段的组件,大部分的组件都可以放进来,主要的作用就是区分每一个阶段在执行什么程序,相当于标志节点。
1.4、Conditional Branch Node(条件分支节点)
这个节点类似与java代码里面的switch语句一样
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
在进入这个组件之前一般要先设定一个变量,通过变量,也就是下面说的实例的传入的值不同,而影响后面的操作分支的调用结果不同。
点击value后面的下拉列表,可以看到多种对比的方式。
我们在最后一个里面可以看到,我们最后一个是空的,也就表示,当前面全都没有满足的时候,就会执行最后一个,且必定执行,所以在使用的时候就要考虑周全一点
示例:
我现在有一个rest开发的接口,可以查询到大学的信息,我直接调用的时候这个接口是可以直接返回信息的。如果我通过操作分支的方式来进行调用的话,他的结构大致就是这样的:
管道FzTestPL调用了RestPL这个管道
我们来看一下FzTestPL里面是什么样的:
由于我们直接设置了body的值为1(如果不想这样,就把这个组件直接删掉,在调用的时候填写一个请求内容即可),这个程序就会直接走左边,从而调用了RestPL,然后返回了学校的信息,这里的信息是text格式的,也可以设置成xml等。
通过查看这调用追踪也可以看到我们的接口直接走了body=1的这边。
那如果我们把body设置成2,会发生什么呢
可以看到,他没有做任何操作,走的是右边程序。
1.5、Operational Branch Node(操作分支节点)
这个组件的作用就是区分各种操作的,使用同一个管道来给不通的操作做对应的分支。
示例:
我这里的例子就用我们DB形式的BS来做展示
我之前的DB接口都是单独操作的,这次我们做一个有包含增删改查操作的接口:
然后我们在PL管道中加入这个操作分支的组件
组件右上角
注意这个地方是需要选择具体的操作的,这里的操作是跟着DB里面来匹配出来的
所以可以看到可以选的方法也是BS里面所拥有的
而我们下面的路由里面也要写成对应的哦
需要注意的是,在这种的操作中,执行数据库删除数据的操作的时候,会留下一条空白的记录,而单纯的DB删除接口则不会留下空白的记录。
小栗子
如果写的是全操作的接口,就会是像这样的
然后填写好相应的信息即可进行接口调用。
如果想要执行其他的操作就选其他的就可以啦。
1.6、REST Branch Node(REST 分支节点)
类似于4的分支节点,且结构也是一样的,但是有一个限制就是,只能放在REST的管道中。
1.7、Error Handler Node(错误处理节点)
这个节点的使用很广泛,基本在每一个操作的地方都会出现这个节点,类似于java里面的throw Exception的代码一样
public class className
{
public void name(String str) throws Exception
{
throw new Exception();
}
}
这个组件是需要在操作开始的地方创建出来,然后会自动携带一个Stage组件,用来填写出错的时候的处理的代码。
示例:
可以通过构建错误,来执行这个错误处理代码。
2、Route(路由)
这个里面所有的组件都是要放在上面节点组件中的Route里面的
2.1、Dynamic Routing(动态路由)
这个组件有点特殊,对于路由的地址需要特定的xml来指定路由的路径。
我们先看一下官方文档是怎么写的。
可以看到的是,这里的路径是需要我们通过isProxy这个属性来手动进行判断的。
经过测试,如果写了false的时候,是不能直接写bs或者pl的路径,我们先展示一下写ps的路径,是如何完成动态路由的。
示例:
1、先写固定的地址。
这里就使用一个已经可以正常使用的ps的地址作为示范。
因为只有一个组件,我在这里就直接写了。
<ctx:route>
<ctx:service isProxy='true'>FZTestPro/ProxyServices/RestPS</ctx:service>
</ctx:route>
//代码解析:
<ctx:route>
<ctx:service isProxy='表示路径是否为ps'>调用的路径</ctx:service>
</ctx:route>
这个就可以直接去调用目标路径的ps,然后返回正常调用的时候的返回的数据。
2、动态地址(PS)
通过修改xqy文件中的路径来实现动态路由(单个)。
这里就直接写了一个xqy文件,可以通过右键项目来创建出一个xqy格式的文件,里面可以写xml的数据就行。
我这里写的比较简单。
<url>FZTestPro/Pipelines/RestPL</url>
我们需要获取这个xqy文件中的这一个路径。
大致的组件结构就是这样的。
直接使用Assign组件来获取就可以了。
然后在路由里面填写这个。
<ctx:route>
<ctx:service isProxy='true'>{$resurl}</ctx:service>
</ctx:route>
注意我这里写的是ps的地址哦。
需要注意的是,这里的获取数据需要加上 { } 来绑定才可以。
然后去测试,可以成功。
测试表示,此时的rest接口的是可以通过动态路由到ps来进行实现的,经过测试,其他的所有接口的ps都可以直接进行动态路由。而我们如果要路由到bs,就需要保证接口是soap接口了,且在路由bs的时候需要指定调用接口使用的operation才能调用成功。
3、动态地址(BS)
先写一个soap接口,这一篇文章可能会帮助到你
https://blog.csdn.net/h22407/article/details/119817982
定位:SOAP接口的开发
还有一个是获取wsdl文件的方式
https://blog.csdn.net/h22407/article/details/119516871
定位:wsdl文件如何获取
经过上面两个文件的介绍,我想你应该能会写一个soap接口了,我现在在这里就直接用了一个soap的接口来进行测试动态路由。
和上面的设置路由的方式一样,唯一的区别就是我们这次调用的不是ps了,就要写成false。
<ctx:route>
<ctx:service isProxy='false'>{'DynamicPro/BusinessServices/MobileCodeBS'}</ctx:service>
<ctx:operation>{'getDatabaseInfo'}</ctx:operation>
</ctx:route>
写成这样,就可以去正常调用了。
这里需要注意的地方就是:
1、调用的路由必须包含operation
2、调用的路由必须false
3、调用的路由地址和oper的名称必须用这个{‘路径’}
来表示如果是表达式就要用{表达式}
表示。
4、如果调用的路由是PL
的,那就可以不用写operation,具体就以PL指定的oper为准。
示例
2.2、Routing(路由)
这里就是正常的路由的组件
设置的时候,用指向的就是目标的BS、PL、PS
下面依旧是我们熟悉的描述
示例:
需要注意的是soap接口的路由是所对应的wsdl里面的方法名称,有几个就会出现几个选项,只需要选择对应的方法即可。
下面的例子可以看到,我们定位了soap类型的bs以后会出现operation的选项。
像这样的soap的接口还有另一个operation的选项,是默认的,这个选项就可以一次性指定多种,就需要在测试的时候去选择对应的操作啦
2.3、Routing Table(路由表)
这里类似于上面的分支,只不过变成了路由的分支,多个路由可以同时放在一个节点里面,这样设置,在不同的情况下,就会执行不同的路由程序。
2.4、If Then(条件判断)
这个就比较自由了,不止可以放在路由节点里面,大部分的节点都可以放。
因为,它既属于路由,也属于流程控制里面,只是不同的位置表示了不同的意义而已。
需要注意的时,这里要放一个完整的判断语句。因为这里只会返回true和false两个,所以就要填写的比较详细一些。
示例:
3、Communication(通讯)
3.1、Dynamic Publish(动态发布)
动态发布这个操作,其实说白了就和动态路由的概念是一样的。
这里我们就直接上示例了:
示例:
1、路由到固定地址
1、BS和PS
bs和ps都属于服务,就一起说了,而且他们的路由方式是一样的。
和之前的bs的路径的写法基本上是一样的。
官方文档,对于Services 是这样写的
所以我们也以相同的方式写
和路由的地方一样,可以设置是否为ps的路径,而bs则需要加一个oper用来帮助定位。
//示例代码
<ctx:route>
<ctx:service isProxy="true">jmsTest/JMSSenderPS</ctx:service>
<ctx:operation></ctx:operation>
</ctx:route>
2、PL
官方文档的示例
对于pl我们只需要按照下面的格式的编写即可。
//示例代码
<ctx:route>
<ctx:pipeline>PublishPro/PL/JMSPL</ctx:pipeline>
</ctx:route>
2、动态地址
同样的也是从XQuery文件中获取的地址,然后去调用,写法和动态路由的写法是一样的,如果不清楚如何写的:
请跳转 2、Route—>2.1、Dynamic Routing------->2/3、动态地址
3.2、Publish(发布)
使用这个组件首先要明白这个组件的目的:将body里面存放的内容,作为消息,发送给消息队列。
所以这个组件的路由地址只能写jms的地址。
然后调用的时候就会看到调用一次,然后消息数量就怎加一条。
示例
如何创建jms接口:
具体的操作步骤可以参考我的这一篇文章
https://blog.csdn.net/h22407/article/details/120830021
我这里用了两个Assign来做标记
这是我所调用的BS的JMS地址
部署到控制台开始调用测试。
先记录调用前我们的消息总数为—4----
开始调用。
可以看到消息数量变成了----5-----条
我们调用一下队列试试。
修改一下调用的bs地址为队列的JNID
调用测试
调用前:
调用成功了。
调用后:
我们来看一下消息具体内容
红框这里面的就是刚刚发的那一条消息,也可以看其他的值卡你的所有消息。
出现了消息的乱码。
为了保证严谨性
我们用英文字符和数字再次进行测试
可以看到我们的消息是正常显示的。
3.3、Publish Table(发布表)
这个的操作其实是和if语句是非常相似的,我们在前面也写到了路由表的使用方法,这里的操作其实也是一样的。只需要修改为jms的接口就可以了。
示例:
先创建两个jms的接口,一个是topic(主题),另一个是queue(队列),如何创建jms接口,我在发布组件的地方已经介绍过了,这里就不赘述了。
这样的接口就可以通过输入body 的不同的值,实现的不同的消息发送。
看我们队列的消息里面就新增加了一条,消息内容为1。
另一个我就不去测试了。
由于我这里写的是很简单的逻辑,所以这里的消息会发送的很单一,在使用的时候需要注意一下,从上面可以看到,目的地收到的消息是body位置的消息,如果想要特殊一点的消息,就可以做一些逻辑处理之类的,随需求自己定义把。
三种组件之间的区别
上面的这三个,我直接用一个表来展示他们之间的区别叭
组件名称 | Dynamic Publish(动态发布) | Publish(发布) | Publish Table(发布表) |
---|---|---|---|
组件作用 | 动态获取目的地,然后发送消息给目的地 | 单个发送消息给目的地 | 根据条件发送消息到不同的目的地 |
组件设置 | 固定的表达式 | 直接应用路由 | 根据条件填写路由 |
区别点 | 通过文件来获取调用的路径,通用性高的接口可以使用 | 比较单一,是基础单元 | 通过条件来分支,可以配置属性,调用跟灵活多变 |
3.4、Service Callout(服务调用)
这个组件是根据我们调用的服务来进行设置其中的属性的。
示例:
初始状态:
引用rest接口(需要输入参数的接口):
引用soap接口(需要输入特定位置信息的接口):
像这种的接口,我们就可以通过组件与组件之间的组合,然后再根据获取的变量,去对管道或者服务进行调用,然后再根据返回的数据,对数据进行处理,适用于多服务之间的调用操作。
不需要输入特定信息,只需要选择对应的方法的接口:
这个样子的接口就需要通过选择对应的方法来实现对应的操作。
3.5、Routing Options(路由选项)
在这个组件里面可以对路由进行一系列的设置,包括请求方式,uri地址,重试间隔等,具体看下面的图
示例:
这里我只设置了一下请求方式
其他的如果需要,就写上就好。
3.6、Transport Header(传输头)
这个组件可以用来修改或者设置Header里面的参数
示例:
具体使用可以参考这个文章
https://blog.csdn.net/h22407/article/details/120162279
文章里面写了如何设置流文件的名称
在下面这个文章里面我写了如何设置响应的文本的格式
https://blog.csdn.net/h22407/article/details/119817982
定位在rest接口测试3.8的时候
4、Flow Control(流程控制)
4.1、For Each(遍历)
这个的使用方式可以参考java里面你的foreach,遍历,这里可以填写很多种形式的数据,可以用来遍历这个数据,然后里面可以填写逻辑处理的代码,每遍历一次,就执行一次内部的代码。
示例:
我们用header里面的数据用作展示
先获取headers里面的数据
$inbound/ctx:transport/ctx:request/tp:headers/*
去测试一下,看看我们有没有获取到这个数据
然后我们遍历,然后把每一次获取到的数据添加到另一个body的最后一个元素。
由于我们需要做遍历。我们就可以直接使用foreach循环来进行上面的一系列操作
那么我们正式开始:
首先,我们先替换body里面的数据,然后把body里面添加一行xml的数据
fn-bea:inlinedXML('<user-header name="p" value="l"/>')
然后我们开始遍历header里面的数据
然后我这里就把获取的数据分配给xxx变量
然后添加这个xxx到body的最后一个子节点
打包,然后执行一下。
就可以看到,这里的xxx显示的是最后一次获取到的xxx的数据,而下面的数据也已经添加到了body里面。
4.2、If Then
这个组件在Route(路由)里面已经说明过了。
这里就不过多阐述了。
4.3、Raise Error(引发错误)
这个组件可以强制引发一个错误,通常和 If Then 组件一起使用
在这个组件里面可以设置错误编码,以及错误信息
示例:
4.4、Reply(回复)
在这个组件里面,可以直接设置回复的信息,成功或者失败,还可以设置这个描述。
但是有一个缺点就是只会返回成功或者失败。如果需要具体的返回信息,建议还是要使用错误节点。
示例:
如果返回是成功,则程序会正常运行
如果返回是失败,程序会报错,然后正常运行,但这个报错不是真的错误,是报告一样的错误。
4.5、Resume(恢复)
resume(恢复)组件是一个只能作用于错误处理的组件,它的作用是为了在程序出现错误之后,把错误的地方修改好,然后恢复程序的正常运行。
示例:
在这个程序里面,我只建立了管道(我这里建的是请求和响应都为txt的管道),然后让他去执行所有事情。创建了判断是为了区分出来结果。
看完了大致的逻辑,我们看一下详细的配置是什么样的。
打包以后到控制台测试一下。
输入1
输入0
输入其他数据
通过上述情况可以看到我们使用的时候,是会进行一系列的处理的。
4.6、Skip(跳过)
可以直接跳过接下来的代码,一般也是和if组件连用的。
同样的也是什么都没有的一个组件。
在上一个代码的逻辑的基础之上,我们试一下这个组件的使用。
示例:
继续用上面的代码,我们这次把当aaa=1的时候让他skip后面的代码,
逻辑上,就可以直接跳过错误处理程序。我们试试看可不可以。
通过测试可以看到,这里的代码到了那个地方,就不再执行下面的程序了,也就是会自动跳过后面的所有程序。
5、Message Processing(消息处理)
5.1、Assign(分配)
这里可以将某一个字符串、值、函数表达式、变量的值、特殊格式的数据等,分配给特定的变量
示例:
Assign组件涉及到的东西有点多,示例也就相应的多了
Assign的几种用法:
当我们打开分配组件的时候
可以看到里面有好多个选择的东西,我这就给大家一一解答这些选择的功能。
1、variables(变量)
下面的这个就是变量的选择页面了,里面可以看到很多个名称,这些列表里面可以帮助我们快速的定位到我们所需要的东西。
具体如何使用可以参考一下我的另一篇文章:
https://blog.csdn.net/h22407/article/details/120048941
定位:如何获取header的数据
2、Function(函数)
这里定义了一些函数的方法,基本所有java的方法都被收录在了里面,还有一些特定的字符串或者数据处理的方法。我这里暂时就只用到了xml序列化和反序列化的操作,具体的使用参考这一篇文章:
https://blog.csdn.net/h22407/article/details/120076002
定位:反序列化和序列化
这个里面就是xml序列化和反序列化的方法
然后其他的用的到的地方就是String字符串的替换
这个类里面的所有的方法都是有关字符串处理的。
需要的时候可以自己去研究一下。
3、Namespaces(命名空间)
在这里我们可以添加我们所需要的这里面默认没有的命名空间,添加新的命名空间的时候需要的有三个参数(Type,Prefix,URI)。
4、一个特别的设置
在我们设置参数的 右边有一个小小的箭头,可以打开列表,里面有很多种不同的设置,可以对参数进行不同的
例如:XQuery Resources来通过获取指定配置文件来获取值;也可以选择XSLT Resources来通过xsl文件获得指定的映射数据;另外两个都是动态获取,之后会涉及到这方面的知识,这里就不说了。
例子:
4.1、assign获取XQuery的值
类似于Java里面获取配置文件的值
设置例子
1、先将这个设置为XQuerey模式
2、通过查询,去定位自己要配置的Xquery文件
3、选择要配置的文件
5、获取变量的某一个节点的内容(xml)
<p>
<a></a>
<b></b>
</p>
如果我想要获取的是p节点下面的b节点的内容
我就可以这样来获取
这样就可以获取到b里面的数据,顺便可以将xml反序列化成String字符串。
5.2、Delete(删除)
这个组件可以删除你指定的位置的字段,一般用来删除特定的xml里面的节点,或者也可以用来删除body节点的内容等,具体的定位方式和上面的分配是一样的。
5.3、Insert(插入)
可以用来给特定位置插入一行数据,可以插入在之后也可以插入在之前,也可以放在这个里面的字节点的第一个或者最后一个的位置。
这里有例子,可以用作参考
https://blog.csdn.net/h22407/article/details/120048941
5.4、Java Callout(Java 标注)
在这里可以添加一个jar包,调用这个组件可以调用jar包里面具体的java方法,这里的Java方法在打包之前一定要确定方法是静态的。
需要注意的一点是,在调用了方法以后,只有显示出来的方法才是可以使用的静态方法
5.5、JavaSctipt(js代码)
在这个里面可以添加一些js代码,具体代码可以参考js编写
https://www.runoob.com/js/js-tutorial.html
5.6、MFL Translate()
5.7、nXSD Translate(nxsd翻译器)
这个可以通过nxsd文件来转换想要转换的数据为任何你指定的格式。
xsd文件示例
5.8、Rename(重命名_xml节点的元素的名称)
这个组件可以修改请求或者响应的元素的指定节点的名称,作用暂时判定为是可以修改众多子节点中的一个,用来区分子节点的名称,之后可能会补充用途
示例:
修改前
修改后
可以看到这里只是修改了节点的第一个子节点的元素名称。
5.9、Replace(替换)
替换节点内容
5.10、Validate(验证)
根据 XML 架构元素或 WSDL 资源验证 XPath 表达式选择的元素。 您只能验证全局元素; 服务总线不支持针对本地元素的验证。
示例:
6、Reporting(报告)
6.1、Alert(警报)
根据管道中的消息上下文生成警报,以发送到警报目的地。 与 SLA 警报不同,警报操作生成的通知主要用于业务目的或报告错误,而不是用于监控系统健康状况。 应考虑到这一点来配置和选择警报目的地。
如果未为服务启用或在域级别启用管道警报,则在消息处理期间会绕过配置的警报操作。
示例:
1、发送警报(包含指定内容)给jms消息队列/主题
先设置alert(预警目标)为发送给jms服务器
然后设置一下alert组件就可以啦。
然后打包给控制台开始测试。
调用之后,就会看到我们的jms队列里面多了一条信息
里面包含了我们的消息类型,以及消息的主体部分的内容,还有消息概括。
现在显示的是乱码,我们可以通过设置消息的格式为文本来解决乱码的问题。
在这里可以进行设置
或者在控制台也是可以进行设置的。
2、发送警报给固定的邮箱。
暂时没有研究到这里,等之后会进行补充
6.2、Log(日志)
构造要记录的消息并定义记录消息的一组属性。
在这里可以选择日志的类别
示例:
我在管道中添加了这样的一条消息
当这一条消息的消息级别是,这两种的时候
调用的信息将会在文件中显示出来。
这个日志文件的具体位置在:
cd /home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/osb_server1/logs/
6.3、Report(报告)
报告里面的内容会记录在osb的数据库中的相应的位置上。之后会有程序来进行专门的区分,我们这里就只是做了保存的操作。
——————————————文章版本更新日志———————————————
更新时间 | 版本 |
---|---|
2021.10.27 | 1.0 |
2021.10.28 | 2.0 |
2021.10.29 | 2.1 |
2021.11.1 | 3.0 |
2021.11.2 | 3.1 |
2021.11.3 | 3.2 |
2021.11.4 | 3.3 |
2021.11.5 | 3.3 |
1.2、PipelinePair Node(管道对节点)
-
v1.0
- 1、第一版大致完成。 v2.0
- 1、新增了文章版本更新日志。
- 2、完善了Rout阶段的对于分支(条件分支、操作分支)的解释和使用,增加了示例。
- 3、修改、补充了部分描述信息。
- 4、补充了For Each的部分示例(未补充完整) v2.1
- 1、补全了For Each的示例(已补充完整)
- 2、增加了Resume和Skip组件的示例 v3.0
- 1、添加了Dynamic Routing(动态路由)的使用,以及示例
- 2、修改了版本列表的展示 v3.1
- 1、完善了Dynamic Routing(动态路由)的使用,以及示例
- 2、完善了Routing(路由)的使用示例
- 3、添加了Publish(发布)组件的使用示例以及介绍 v3.2
- 1、完善了Publish(发布)组件的使用示例以及介绍
- 2、添加了Dynamic Publish(动态发布)的使用,以及示例
- 3、添加了Publish Table(发布表)的使用,以及示例 v3.3
- 1、添加了Service Callout(服务调用)组件的使用,以及示例
- 2、添加了Alert(警报)组件的使用,以及示例 v3.4
- 1、完善了Alert(警报)组件的示例
- 2、添加了Log(日志)组件的示例