1

親愛なる皆様、明けましておめでとうございます。

私の目的は次のとおりです。

wso2as に 2 つの axis2 Web サービス (ws1、ws2) をデプロイしています。クライアントは、wso2esb を介して ws1 に引数を与える必要があり、返された値は、最終的な値をクライアントに返す引数として ws2 に与える必要があります。したがって、クライアントが行うことは、引数を ws1 に渡して、ws2 から最終的な応答を受け取るだけです。

質問:

そのステップバイステップを作成し、ws1とws2を通信させる方法(プロキシ経由だと思います)?私は多くのチュートを試しましたが、誰も私の詳細な理由を知りません。私はESBの初心者です。

どうもありがとう。

4

3 に答える 3

1

はい。これは 1 ステップで実行できます。以前にプロジェクトでこれを行ったことがあります。次の手順を実行できます。

1. ws1 and ws2 are both have "endpoints" defined in the ESB.
2. In the ws1 proxy, define a target inSequence to point to a "sequence"
   for example "ws1InSequence"
3. In the "ws1InSequence", you can use <filter> to make sure the value is exists.
   Then you can <send> to the ws1 <endpoint> with "receive" attribute point to
   a sequence for example "ws1ResultSequence"
4. In the ws1ResultSequence, you can again use the <filter> to make sure 
   it has the parameter/value you need. Then you can use param/value to format a request message.
<payloadFactory>
    <format>
        <ns1: ws2Operation
            xmlns:ns1="ws2Namespace">
            <element1 xmlns="">$1</element1> 
            <!-- Note $1 will have the //paramName value from the ws1 Result message -->
            <element2 xmlns="">$2</element2>
            <!-- Note $2 will have the //paramName2 value from the ws1 Result message -->
    </format>
    <args>
        <arg expression="//paramName" />
        <arg expression="//paramName2" />
    </args>
</payloadFactory>
5. Still in ws1ResultSequence, after you create the request message, 
   you <send> it to the ws2 proxy. Then in the ws2 proxy, in the <outSequence>
   you can juse use <send/> to send the response to the client.

例外(faultSequence)処理を含める必要がある場合があることに注意してください。

WSO2ESB は構成に Apache Synapse を使用します。構文と使用例のほとんどは、ドキュメントで見つけることができます: http://synapse.apache.org/userguide/config.html

更新: これを例として使用できます。注、これは必要に応じて完成したコードではない可能性があり、例外処理を追加する必要がある場合があります。

   <sequence xmlns="http://ws.apache.org/ns/synapse" name="ws1ResultSequence"
trace="enable" onError="ws1ResultSequenceErrorHandler">
<log level="custom">
    <property name="sequence" value="INVOCATION START: ws1ResultSequence" />
</log>
<!-- record the original message for future reference -->
<enrich>
    <source clone="true" type="envelope" />
    <target action="replace" type="property" property="ORIGINAL" />
</enrich>

<!-- Check if the ws1 result message has the value -->
<property
    xmlns:ns1="ws1Namespace"
    name="valueExists" expression="//ns1:element1" />
    <!--Note here, element1 is the element name which has the value: output1 -->

<filter xpath="fn:boolean( get-property('valueExists') )">
    <then>
        <!-- create the request message to invoke ws2 -->
        <payloadFactory>
            <format>
                <ns1:ws2OperationName
                    xmlns:ns1="ws2Namespace">
                    <element2 xmlns="">$1</element2>
                </ns1:ws2OperationName>
            </format>
            <args>
                <arg expression="//ns1:element1" />
            </args>
        </payloadFactory>
        <log level="custom">
            <property name="inInvokeWS2" value="INVOCATION START: value from ws1 result exists" />
        </log>

        <send>
            <endpoint key="ws2Sequence" />
        </send>
        <drop/>
    </then>
</filter>
<!-- No result value found from the ws1 result message -->
<send>
    <endpoint key="DoSomethingElseOrThrowError" />
</send>

于 2013-01-04T05:33:33.697 に答える
0

以下のすべての手順を説明します。


ウェブサービス

  1. wso2as にデプロイされた wsOne: パラメータとして wsOne (input1, size) を取り、3 つの文字列 (t1、t2、output1) のテーブルを返します。
  2. wso2as にデプロイされた ws2One: パラメータとして wsTwo(output1) を受け取り、文字列を返します: "Hello output1"。

wsOne :

EndPoint (In wso2as): http://localhost:9765/services/wsOne

WSDL (In wso2as): http://localhost:9765/services/wsOne?wsdl

wsTwo :

EndPoint (In wso2as): http://localhost:9765/services/wsTwo

WSDL (In wso2as): http://localhost:9765/services/wsTwo?wsdl


  1. 今、私は wso2esb にいます。各 ws のプロキシ内でシーケンスを呼び出すため、プロキシの前にシーケンスを作成する必要があります。

シーケンス

ServiceBus -> シーケンス -> 定義済みシーケンス -> シーケンスの追加。

ws1ResultSequence

何が原因である必要があるのか​​ 正確にはわかりません.ペイロードを作成しようとしたときにエラーが発生しました..

ws1InSequence

<sequence xmlns="http://ws.apache.org/ns/synapse"><in>
  <filter>
     <then>
        <send receive="ws1ResultSequence">
           <endpoint>
              <address uri="http://localhost:9765/services/wsOne"/>
           </endpoint>
        </send>
       </then>
     <else/>
    </filter>
  </in>
</sequence>

ws2シーケンス

<sequence xmlns="http://ws.apache.org/ns/synapse" name="conf:/ws2Sequence">
   <out>
      <send/>
   </out>
</sequence>

プロキシ

ws1Proxy

[追加] -> [プロキシ サービス] -> [カスタム プロキシ] -> [名前]: ws1proxy、wsdl の公開: [いいえ]、[次へ] -> [InSequence を定義] -> [レジストリから選択] -> [ws1InSequence]。

ws2Proxy

[追加] -> [プロキシ サービス] -> [カスタム プロキシ] -> [名前]: ws2proxy、wsdl の公開: [いいえ]、[次へ] -> [InSequence を定義] -> [レジストリから選択] -> [ws2Sequence]。


私の歩みは正しいですか?SOA、ESB などとの最初のやり取りなので、多くの間違いを犯したことはわかっています... チェーンを開始して必要な結果 (ws1Proxy) またはその他を取得するために、クライアントは何を実行する必要がありますか?

お時間をいただきありがとうございます。

于 2013-01-04T17:15:25.203 に答える