WSO2 ESB服务编排

时间:2012-05-21 15:35:26

标签: esb wso2 orchestration

Hello WSO2社区和hello Stackoverflow,

我从ESB开始对SOA套件的测试进展顺利:现在ESB识别外部服务,创建正确的代理,返回正确的结果。

  

解决

     

关于那个,我有两个问题:第一个是“试试吧”   功能引发异常:

"Cannot find dispatch method for {http://schemas.xmlsoap.org/soap/envelope/}Envelope
     

[tagOpened] / soapenv:文本[tagClosed]“

     

当我尝试发送为模拟服务创建的SOAP封装时   代理的Web服务。

     

无论如何,如果我从外部客户端(在...上创建)尝试代理服务   Netbeans)它很棒。

     

ANSWER

     

对于第一部分,原因很可能是跨域问题,因为try-it通过java脚本存根发送消息   浏览器。你会发现这在服务时效果很好   它本身托管在ESB本身,因为请求通过   同一个域名。这就是为什么,它通过一个完美的工作原理   正常的客户端调用,它不能通过try-it工作。

第二个问题是我无法协调两项服务。我的目标是将第一个服务的输入发送到第二个服务,然后发送给用户。

我正在研究Tharindu Mathew建议的教程:除了一件事:XSLT转换之外,现在一切对我都有意义。

以下是教程建议您创建的输出顺序:

<outSequence xmlns="http://ws.apache.org/ns/synapse">
   <switch source="get-property('STATE')">
      <case regex="PERSON_INFO_REQUEST">
         <log level="full">
            <property name="sequence" value="outSequence - STATE 01 - response from PersonInfoService" />
         </log>
         <xslt key="xslt">
            <property name="amount" expression="get-property('ORG_AMOUNT')" />
         </xslt>
         <log level="full">
            <property name="sequence" value="outSequence - STATE 01 - request for CreditService" />
         </log>
         <property name="STATE" value="CREDIT_REQUEST" />
         <send>
            <endpoint key="CreditEpr" />
         </send>
      </case>
      <case regex="CREDIT_REQUEST">
         <log level="full">
            <property name="sequence" value="outSequence - STATE 02 - response from CreditService" />
         </log>
         <send />
      </case>
   </switch>
</outSequence>

现在,关注第一种情况下的交换机的XSLT节点,你可以看到只有一个获取金额属性。 所以我认为我们从序列中有一个XML来说明ID,这就得到了amount属性(我不知道它做了什么)。

然后教程建议:

  

要创建对此CrediService的请求,我们将以下XSLT与XSLT介体一起使用。注意,我们使用我们存储在此XSLT中的ORG_ID作为XSLT参数并使用XSLT介体。

以下是教程中显示的XSLT:

<xsl:stylesheet version="2.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
        xmlns:ns="http://samples.esb.wso2.org"
        xmlns:ax21="http://samples.esb.wso2.org/xsd"
        exclude-result-prefixes="ns fn">
<xsl:param name="amount"/>
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
  <xsl:apply-templates select="//ns:getResponse" />
</xsl:template>

<xsl:template match="ns:getResponse" xmlns:ns="http://samples.esb.wso2.org">
<sam:credit xmlns:sam="http://samples.esb.wso2.org" xmlns:xsd="http://samples.esb.wso2.org/xsd">
    <sam:info>
        <xsd:amount><xsl:value-of select="$amount"/></xsd:amount>
        <xsd:personInfo>
            <xsd:address><xsl:value-of select="ns:return/ax21:address"/></xsd:address>
            <xsd:id><xsl:value-of select="ns:return/ax21:id"/></xsd:id>
            <xsd:name><xsl:value-of select="ns:return/ax21:name"/></xsd:name>
        </xsd:personInfo>
    </sam:info>
</sam:credit>
</xsl:template>
</xsl:stylesheet>

我被要求将类似的文件放入WSO2 ESB的资源目录中,但该文件从未在教程中使用过:

  

将示例zip中的personToCredit.xslt复制到WSO2 ESB的资源目录。

--------- LITTLE PARENTHESIS -----------

WSDL文件在声明后未被使用:

  

将示例zip中的CreditProxy.wsdl复制到WSO2 ESB的资源目录中。

我在Configuration / Governance Registry中找不到WSDL文件,我不知道如何解决它,所以我选择内联指定它。

--------- LITTLE PARENTHESIS END -----------

这句话之后是XSLT文件文本。我现在的主要问题是:

我应该把这个XSLT放在哪里?我不知道在哪里放XSLT介体,也不知道如何构建它。 我应该依赖注册管理机构吗?

一个完美的答案可能是out序列的代码,以及与XSLT中介建议的指定连接。

OverTheBitStair

2 个答案:

答案 0 :(得分:1)

Hi OverTheBitStair(漂亮的尼克!),

对于第一部分,原因很可能是跨域问题,因为try-it通过浏览器中的java脚本存根发送消息。您会注意到,当服务本身托管在ESB本身时,这很有用,因为请求通过同一个域。这就是为什么它通过正常的客户端调用完美地工作,但它不能通过try-it工作。

对于第二部分,简短的回答是肯定的,这是可能的。就ESB而言,除了作为中介引擎之外,我们还将其称为轻量级编排引擎。这意味着对于轻量级和短期(<1天)的流程,我们可以使用ESB解决业务流程需求,而无需引入业务流程服务器。

为此,我们使用这种称为服务链的方法。它的作用是引入一种方法,从初始服务调用中获取一些输出,并在后续调用中使用它。文章WSO2 ESB by example - Service Chaining应该可以帮助您了解您正在寻找的内容的实施细节。

希望这有帮助。

答案 1 :(得分:0)

如果您创建服务链方案,其中您的代理服务调用其他两个服务并将结果返回给代理服务的调用方,则它看起来像这样:

来电 - &gt;代理服务 - seq_A - &gt; Service1 - seq_B - &gt; Service2 - seq_C - &gt; (代理服务响应) - &gt;呼叫者

在这种情况下,seq_A将是代理服务的顺序,seq_C是代理服务的out序列,seq_B是另一个命名序列。

seq_A的输入(即消息正文)将是代理服务的输入。 seq_A将在末尾包含一个发送中介,并且在序列中的那一点,消息上下文将成为Service1的输入。发送调解器还指向要为回复执行的seq_B。

在seq_B开始时,消息正文包含Service1的输出。如果要在服务调用之前保留一些消息数据,则需要将其保存在上下文中的属性中。 在seq_B结束时,你会有一个发送调解员;此时,消息体应该包含对Service2的输入,如果seq_C是代理服务的输出序列,那么发送中介在这种情况下不需要指向显式的应答序列 - 那么默认情况下将使用该序列。

当seq_C正在执行时,此时的消息体是来自Service2的响应。同样,如果您需要在调用Service2之前使用/组合某些数据,则需要将其保存到属性中。

根据每个步骤所需的输入和转换的特定需求,处理起来相当简单或有点麻烦。 还应考虑的是在错误情景中需要发生的事情,因为这可能会增加一些额外的复杂性,具体取决于要求。

相关问题