1

こんにちは WSO2 コミュニティ、こんにちは Stackoverflow です。

ESB から開始する SOA スイートのテストは順調に進んでいます。ESB は外部サービスを認識し、正しい結果を返す正しいプロキシを作成します。

解決した

それについては、2 つの問題があります。1 つ目は、「試してみる」機能で例外が発生することです。

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

[tagOpened]/soapenv:Text[tagClosed]"

プロキシされたWebサービスのモックサービス用に作成されたSOAPエンベロープを送信しようとすると.

とにかく、(Netbeans で作成された) 外部クライアントからプロキシ サービスを試すと、うまく機能します。

答え

最初の部分については、ブラウザから Java スクリプト スタブを介してメッセージを送信しているため、おそらくクロス ドメインの問題が原因です。リクエストが同じドメインを通過するため、サービス自体が ESB 自体でホストされている場合、これはうまく機能することがわかります。これが、通常のクライアント呼び出しでは完全に機能しますが、試してみると機能しない理由です。

2 つ目の問題は、2 つのサービスを調整できないことです。私の目的は、最初のサービスの入力を 2 番目のサービスに送信し、次にユーザーに送信することです。

私は、Tharindu Mathew が提案したチュートリアルに取り組んでいます。XSLT 変換という 1 つの点を除いて、すべてが理解できるようになりました。

チュートリアルで作成するように提案されているアウト シーケンスは次のとおりです。

<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 ノードに注目すると、金額プロパティの get だけがあることがわかります。そのため、ID を示すシーケンスからの XML があると思います。これは 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 の resources ディレクトリに配置するように求められましたが、このファイルはチュートリアルでは使用されません。

サンプル zip 内の personToCredit.xslt を WSO2 ESB の resources ディレクトリにコピーします。

----------小括弧-----------

次のように記述された後も、WSDL ファイルは使用されませんでした。

サンプル zip 内の CreditProxy.wsdl を WSO2 ESB の resources ディレクトリにコピーします。

Configuration/Governance Registry に WSDL ファイルが見つからず、対処方法がわからないため、代わりにインラインで指定することにしました。

---------小括弧の終わり-----------

この文の後に、XSLT ファイルのテキストが続きます。私の主な質問は次のとおりです。

この XSLT はどこに配置すればよいですか? XSLT メディエーターをどこに配置すればよいか、ビルド方法もわかりません。レジストリに依存する必要がありますか?

完璧な答えは、out シーケンスのコードであり、XSLT メディエーターとの指定された接続が示唆されている可能性があります。

オーバーザビットステア

4

2 に答える 2

1

こんにちは OverTheBitStair (ナイス ニック!)、

最初の部分については、ブラウザから Java スクリプト スタブを介してメッセージを送信しているため、おそらくクロス ドメインの問題が原因です。リクエストが同じドメインを通過するため、サービス自体が ESB 自体でホストされている場合、これはうまく機能することがわかります。これが、通常のクライアント呼び出しでは完全に機能しますが、試してみると機能しない理由です。

2 番目の部分については、簡単に言えば「はい、可能です」です。ESB に関しては、メディエーション エンジンであることに加えて、軽量のオーケストレーション エンジンと呼んでいます。これは、軽量で短期間 (1 日未満) のプロセスの場合、Business Process Server を導入することなく、ESB を使用してオーケストレーション要件を解決できることを意味します。

これを行うには、サービス チェーンと呼ばれるこの方法を使用します。これが行うことは、最初のサービス呼び出しから何らかの出力を取得し、それを後続の呼び出しで使用するメソッドを導入することです。記事WSO2 ESB by example - Service Chainingは、探しているものの実装の詳細について役立ちます。

お役に立てれば。

于 2012-05-22T04:45:06.280 に答える
0

プロキシ サービスが他の 2 つのサービスを呼び出し、その結果をプロキシ サービスの呼び出し元に返すサービス チェーン シナリオを作成すると、次のようになります。

発信者 --> プロキシ サービス -- seq_A --> Service1 -- seq_B --> Service2 -- seq_C --> (プロキシ サービス応答) --> 発信者

この場合、seq_A はプロキシ サービスの in シーケンス、seq_C はプロキシ サービスの out シーケンス、seq_B は別の名前付きシーケンスになります。

seq_A への入力、つまりメッセージ本文は、プロキシ サービスへの入力になります。seq_A には最後に送信メディエーターが含まれ、シーケンスのその時点で、メッセージ コンテキストが Service1 への入力になります。送信メディエーターは、応答のために実行される seq_B も指します。

seq_B の開始時に、メッセージ本文には Service1 からの出力が含まれます。サービス呼び出し前のメッセージ データを保持したい場合は、それをコンテキストのプロパティに保存する必要があります。seq_B の最後には、送信メディエータがあります。その時点で、メッセージ本文には Service2 への入力が含まれている必要があります。この場合、seq_C がプロキシ サービスのアウト シーケンスである場合、送信メディエーターは明示的な応答シーケンスを指す必要はありません。その場合、デフォルトで使用されます。

seq_C がその時点でメッセージ本文を実行しているときは、Service2 からの応答です。繰り返しますが、Service2 を呼び出す前にデータを使用/結合する必要がある場合は、それをプロパティに保存する必要があります。

各ステップで必要な入力と変換の特定のニーズに応じて、処理がかなり簡単な場合もあれば、少し面倒な場合もあります。また、要件によっては、これにより複雑さが増す可能性があるため、エラー シナリオで何が発生する必要があるかについても考慮する必要があります。

于 2012-05-23T19:31:16.103 に答える