WSO2 ESB 5.0.0 Solution Project 使用教程

WSO2   2025-01-12 06:00   180   0  

一、 新建 WSO2 解决方案



二、添加 Rest API

右键单击api文件夹,添加一个REST API


打开 api 的 xml 文件,单击 Resource,在属性把 Post 设为 true,这个是设置可以接收 http 方法。

三、Property Mediator

属性中介器对消息没有直接影响,而是对流经 Synapse 的消息上下文产生影响。 可以通过 Synapse XPath 变量或 get-property() 扩展函数检索消息上设置的属性。 一个属性可以有一个定义的有效范围。 如果属性没有定义的范围,则默认为 Synapse 消息上下文范围。 使用指定为 remove 的操作的属性元素,可以删除任何现有的消息上下文属性。

1、设置 Property 接收 xml / json 数据

2、设置Property属性

Property Action

  • set:如果选择此项,将在消息上下文中设置该属性。

  • remove:如果选择此项,该属性将从消息上下文中移除。

Value Type

  • Value:如果选择此项,静态值将被视为属性值,并且应在值参数中输入该值。

  • Expression:如果选择此项,则在调解期间将通过Value Expression来确定属性值。 此表达式应输入到 Expression 参数中。

Property Data Type

  • 属性的数据类型。 属性中介将把属性作为选定类型的属性进行处理。

①、JSON 数据解析公式:json-eval($.name)

多层解析:json-eval($.a.b.c)

②、XML数据解析公式://name

多层解析://a//b//c

③、添加多个 Property


④、通过 Property 获取 header

7cdffa31fa7c663fc77b87cab662221.png

<property expression="$trp:usercode" name="usercode" scope="default" type="STRING"/>
<property expression="$trp:password" name="password" scope="default" type="STRING"/>

四、Class Mediator

类中介器创建自定义指定类的实例并将其设置为中介器。 该类必须实现 org.apache.synapse.api.Mediator 接口。 如果指定了任何属性,则在初始化期间在类上调用一次相应的 setter 方法。
仅当没有已提供所需功能的内置介体时,才将类介体用于特定于用户的自定义开发。 维护自定义类会产生很高的开销。 因此避免使用它们,除非场景经常重复使用并且非常特定于用户。

1、添加 Class 中介器

2、设置 Class 属性

3、设置 Property Name

4、新建一个 Mediator Project



5、在类中获取 Property 的数据

类中设置的 get、set 的属性名必须和上面设置的 Property Name 一致。

6、在类中返回 Property

此处返回的是 xml 格式,则在 PayloadFactory 的 get-property 设置的应该是 xml 格式。

五、PayLoadFactory Mediator

PayloadFactory Mediator 转换或替换消息的内容。 中介器配置中的每个参数都可以是静态值,或者可以指定 XPath 或 JSON 表达式以通过针对现有 SOAP 消息评估提供的表达式来在运行时获取值。 可以配置请求或响应的格式并将其映射到提供的参数。

1、添加 PayLoadFactory

2、设置 PayloadFactory 属性

Media Type

  • 此参数用于指定是否应以 JSON 或 XML 格式创建消息负载。

Payload Format

  • Inline:如果选中此选项,则可以通过在出现的文本字段中输入有效负载格式在 PayloadFactory 介体配置中进行定义。 要将内容添加到有效负载,请使用 $n 格式为要添加的每个值输入变量(从 1 开始并随着每个附加变量递增,即 $1、$2 等)。 然后,将按照与变量相同的顺序创建参数,以指定每个变量的实际值。

  • Register Reference:如果选择此项,则可以选择保存在注册表中的现有负载格式。 单击相关的 Governance Registry 或 Configuration Registry 以从资源树中选择有效负载格式。

①、返回单个参数

返回JSON数据,Payload为:{"ESB":$1}

Class 中介器返回的必须是 json 才能使用此表达式
在Value中指定参数返回值的表达式。
返回全部值:$.
返回esb的temp的值:$.esb.temp

返回xml数据,Payload为:$1


此处的 get-property('resp') 的参数名必须和在 Class 在返回的 Property 一致!!!

②、返回多个参数

XML


JSON



六、Response Mediator

响应中介器停止对当前消息的处理并将消息作为响应发送回客户端。

1、添加一个Response

七、发布到 WSO2 ESB







第一次运行可能会发布不成功,重新Redeploy一下


八、使用 Postman 测试


WSO2输出

日志:
property_name: jsondata
xmldata: {"ESB":{"DATA":{"DATAINFOS":{"PUUID":11111,"SYNCODE":"ZWY","DATAINFO":{"DESC1":"ABC"}}}}}
result: {"result":"S","moveTotal":12}
[2021-07-09 10:28:24,629]  INFO - LogMediator To: /ttt, MessageID: urn:uuid:4bbb1765-2743-4cc6-a86e-3ad670237d41, Direction: request, Payload: {"ESB":{"result":"S","moveTotal":12}}

九、单个接收、返回属性示例类

package com;
import org.apache.synapse.MessageContext; 
import org.apache.synapse.mediators.AbstractMediator;
import org.json.JSONObject;
import org.json.XML;
public class TTTest extends AbstractMediator { 
    private String property_name;
    public String getProperty_name() {
        return property_name;
    }
    public void setProperty_name(String property_name) {
        this.property_name = property_name;
    }
    public boolean mediate(MessageContext context) { 
        // TODO Implement your mediation logic here 
        String xmldata = (String) context.getProperty(property_name);
        System.out.println("property_name: " + property_name);
        System.out.println("xmldata: " + xmldata);
        //StringBuffer resultss = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        //resultss.append("<ESB></ESB>");
        String sss = "<result>S</result><moveTotal>" + 12 + "</moveTotal>";
        //JSONObject j = XML.toJSONObject(sss);
        System.out.println("result: " + sss);
        context.setProperty("response", sss);
        return true;
    }
}

十、单个接收、返回属性示例 REST API.xml

<?xml version="1.0" encoding="UTF-8"?>
<api context="/ttt" name="ttt" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST GET">
        <inSequence>
            <property expression="json-eval($.)" name="jsondata" scope="default" type="STRING"/>
            <class name="com.TTTest">
                <property name="property_name" value="jsondata"/>
            </class>
            <payloadFactory media-type="json">
                <format>{"ESB":$1}</format>
                <args>
                    <arg evaluator="xml" expression="get-property('response')"/>
                </args>
            </payloadFactory>
            <log level="full"/>
            <respond/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

十一、多个接收、返回属性示例

package com;
import org.apache.synapse.MessageContext; 
import org.apache.synapse.mediators.AbstractMediator;
public class TTTest extends AbstractMediator { 
    private String property_name;
    private String property2;
    public String getProperty_name() {
        return property_name;
    }
    public void setProperty_name(String property_name) {
        this.property_name = property_name;
    }
    public String getProperty2() {
        return property2;
    }
    public void setProperty2(String property2) {
        this.property2 = property2;
    }
    public boolean mediate(MessageContext context) { 
        // TODO Implement your mediation logic here 
        String p1 = (String)context.getProperty(property_name);
        String p2 = (String)context.getProperty(property2);
        System.out.println("p1: " + p1);
        System.out.println("p2: " + p2);
        String args = "{\n" + 
                "    \"esb\":{\n" + 
                "        \"args1\":\"aaaaaaaaaaa\",\n" + 
                "        \"args2\":{\n" + 
                "            \"bbb\":\"bbbbbbbbbbb\"\n" + 
                "        }\n" + 
                "    }\n" + 
                "}";
        context.setProperty("args", args);
        return true;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<api context="/test_first" name="testfirst" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="POST GET">
        <inSequence>
            <property expression="json-eval($.esb.args1)" name="test" scope="default" type="STRING"/>
            <property expression="json-eval($.esb.args2)" name="test2" scope="default" type="STRING"/>
            <class name="com.TTTest">
                <property name="property_name" value="test"/>
                <property name="property2" value="test2"/>
            </class>
            <payloadFactory media-type="json">
                <format>{"ESB": {&#xd;
        "args1":$1,&#xd;
        "args2":$2&#xd;
    }       &#xd;
}</format>
                <args>
                    <arg evaluator="json" expression="$.esb.args1"/>
                    <arg evaluator="json" expression="$.esb.args2"/>
                </args>
            </payloadFactory>
            <respond/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

十二、Call Mediator

Call Mediator用于将消息从 ESB 发送到端点。可以以阻塞或非阻塞方式调用服务。
      当以非阻塞模式调用服务时,底层工作线程无需等待响应即可返回。在阻塞模式下,底层工作线程被阻塞并在向端点发送请求后等待响应。阻塞模式下的调用中介器与 Callout 中介器非常相似。
      在阻塞和非阻塞模式下,Call 中介器都以同步方式运行。因此,中介在服务调用后暂停,并在收到响应时从序列中的下一个中介恢复。调用中介器允许创建独立于底层架构的配置。
      Call 中介器的非阻塞模式利用非阻塞传输来获得更好的性能。因此,建议尽量在非阻塞模式下使用。但是,有些场景需要使用阻塞模式。例如,当实现与 JMS 事务相关的场景时,以阻塞模式使用底层线程至关重要。
      在阻塞模式下,Call mediator 使用/repository/conf/axis2/axis2blockingclient.xml 文件作为 Axis2 配置。有关可为呼叫介体配置的阻塞传输相关参数的更多信息,请参阅配置axis2blockingclient.xml。

Endpoint Type

  • None:如果不提供端点,请选择此选项。 Call 中介将使用其 wsa:to 地址发送消息。

  • Define Inline:如果选择此项,则应将消息发送到的端点可以包含在呼叫中介器配置中。 单击添加以添加所需的端点。

  • Pick From Registry:如果选择此项,则可以将消息发送到当前作为资源保存在注册表中的预定义端点。 单击相关的配置注册表或治理注册表以从资源树中选择所需的端点。

  • XPath:如果选择此项,则消息应发送到的端点将通过 XPath 表达式派生。 需要在选择此选项时出现的文本字段中输入相关的 XPath 表达式。(如果要提供表达式,则可以单击 NameSpaces 添加命名空间。 然后将出现 Namespace Editor 面板,可以在其中提供 XPath 表达式中使用的任意数量的名称空间前缀和 URL。)

Blocking

  • 如果设置为 true,则可以在阻塞模式下使用呼叫调解器。

十三、AddressEndpoint

地址端点是通过指定 EPR(端点参考)和配置的其他属性定义的端点。
(简单的来说就是 Call Mediator 接收消息的端点)
属性说明
Basic

  • URI:目标端点的EPR。

  • Format:端点的消息格式。

  • Leave As-Is:如果选中此选项,则不会对传出消息进行任何转换。

  • SOAP 1.1:如果选择此项,消息将转换为 SOAP 1.1。

  • SOAP 1.2:如果选择此项,消息将转换为 SOAP 1.2。

  • Plain Old XML (POX):如果选择此选项,消息将转换为纯旧 XML 格式。

  • Representational State Transfer (REST) - 如果选择此项,消息将转换为 REST。

  • GET:如果选择此项,消息将转换为 HTTP Get 请求。

  • statistics enabled:这将启用端点的统计信息。

  • trace enabled:这将启用端点的跟踪。

①、给消息添加Header


十四、DataMapper

Data Mapper 中介器是一种可以集成到中介序列中的数据映射解决方案。它将一种数据格式转换并转换为另一种数据格式,或更改消息中数据的结构。它提供了一个基于 WSO2 Developer Studio 的工具来创建图形映射配置,并生成 WSO2 Data Mapper 引擎执行此图形映射配置所需的文件。
      WSO2 数据映射器是一个独立的组件,不依赖于任何其他 WSO2 产品。但是,其他产品可以使用 Data Mapper 来实现/提供数据映射功能。 Data Mapper Mediator 是中间组件,它提供了到 WSO2 ESB 的数据映射能力。
      数据映射器介体从注册表中查找配置文件,并使用输入消息类型 (XML/JSON/CSV) 和输出消息类型 (XML/JSON/CSV) 配置数据映射引擎。然后它从 WSO2 ESB 消息流中获取请求消息,并使用配置的数据映射引擎执行转换并将输出消息添加到 ESB 消息流。



本例演示JSON转XML
输入JSON
{
**    "esb":{
       "args1":"aaaaaaaaaaa",
       "args2":{
           "bbb":"bbbbbbbbbbb"
       }
   }
}
输出XML

   aaaaaaaaaaa
   
     bbbbbbbbbbb
   

保存为文件**

右键单击,选择Load Input


Output选择xml
导入之前保存的文件
把箭头拉线接上,即可完成JSON转XML


最后记得把Configuration添加到项目

十五、Log Mediator

日志中介器用于记录中介消息。

Log Category:
以下日志级别对应于 ESB 服务级别日志。
TRACE - 这指定了比 DEBUG 更细粒度的信息事件。
DEBUG - 这指定了对调试应用程序最有用的细粒度信息事件。
INFO - 这指定了在粗粒度级别突出显示应用程序进度的信息性消息。
WARN - 这表示潜在的有害情况。
ERROR - 这指定了可能仍允许应用程序继续运行的错误事件。
FATAL - 这表示可能会导致应用程序中止的非常严重的错误事件。
Log Level:
Full:如果选择此选项,将记录在简单级别记录的所有标准标题以及消息的完整有效负载。 此日志级别会导致解析消息内容,从而导致性能开销。
Simple:如果选择此项,将记录标准头(即 To、From、WSAction、SOAPAction、Reply To 和 MessageID)。
Headers头:如果选中此选项,则会记录所有 SOAP 标头块。
Custom:如果选择此项,则只会记录添加到日志介体配置的属性。
Log Separator:
此参数用于指定要在日志中用于分隔属性的值。 , 逗号是默认值。


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。