0

私の WSO2 ESB 4.7.0 では、このプロキシを構成しました。

<proxy xmlns="http://ws.apache.org/ns/synapse" name="SendingByJmsAddressProxy"
     transports="https,http"
     statistics="disable"
     trace="disable"
     startOnLoad="true">
 <target>
    <inSequence>
       <send>
          <endpoint>
             <address uri="http://localhost:8080/RestService/rest/servizio"/>
          </endpoint>
       </send>
    </inSequence>
    <outSequence>
       <log>
          <property name="codice" expression="//codice"/>
       </log>
       <log level="full"/>
       <switch source="//codice">
          <case regex="asd">
             <send/>
          </case>
          <case regex="0">
             <log>
                <property name="codice" value="check1"/>
             </log>
             <send/>
             <payloadFactory media-type="xml">
                <format>
                   <code>$1</code>
                </format>
                <args>
                   <arg xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" evaluator="xml"
                        expression="//codice"/>
                </args>
             </payloadFactory>
             <property name="messageType" value="application/xml"/>
             <log level="full"/>
             <send>
                <endpoint>
                   <address uri="jms:/testQueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&java.naming.provider.url=repository/conf/jndi.properties&transport.jms.DestinationType=queue"/>
                </endpoint>
             </send>
          </case>
       </switch>
    </outSequence>
 </target>
 <description/>
</proxy>

inSequence では、クライアントのリクエストを Rest Service に転送します。Rest Service のレスポンスは次のような json 文字列です。

{
  "codice":"0",
  "messaggio":"Operazione effettuata 18:12",
  "path":"\/path\/1AASSCOGNOME_NOME.111.2231\/",
  "documenti":[{
            "idAggregatoContenitore":"3508",
            "idDocumento":"016601",
            "idVersione":"17010",
            "numVersione":"1",
            "tipoDocumento":"Documento",
            "autore":"sysadmin",
            "titolo":"prova1",
            "fileName":"FStandard.xml",
            "checkedOut":"false",
            "idDocumentoPadre":"",
            "flagAllegati":"false",
            "flagDaProtocollare":"true",
            "dataCreazione":"11\/02\/2013 19:05",
            "dataChekin":"11\/02\/2013 19:05",
            "mimeType":"text\/xml",
            "empty":"false",
            "data":"1660100000",
            "cache":"false",
            "tipo":"D",
            "nome":"prova1",
            "keyData":"16601",
            "keyNome":"prova1",
            "keyNumero":"",
            "keyTipo":"D",
            "fileExtension":"path\/xml_file.png",
            "evidenza":"false",
            "originalDocumentoPadreId":"",
            "originalDocumentoId":"016601",
            "originalAggregatoContenitoreId":"3508"
          },
          {
            "idAggregatoContenitore":"3508",
            "idDocumento":"016602",
            "idVersione":"17011",
            "numVersione":"1",
            "tipoDocumento":"Documento",
            "autore":"sysadmin",
            "titolo":"123456789",
            "fileName":"HTTP Proxy Server.jmx",
            "checkedOut":"false",
            "idDocumentoPadre":"",
            "flagAllegati":"false",
            "flagDaProtocollare":"true",
            "dataCreazione":"11\/02\/2013 19:19",
            "dataChekin":"11\/02\/2013 19:19",
            "mimeType":"application\/octet-stream",
            "empty":"false",
            "data":"1660200000",
            "cache":"false",
            "tipo":"D",
            "nome":"123456789",
            "keyData":"16602",
            "keyNome":"123456789",
            "keyNumero":"",
            "keyTipo":"D",
            "fileExtension":"path\/Documento.png",
            "evidenza":"false",
            "originalDocumentoPadreId":"",
            "originalDocumentoId":"016602",
            "originalAggregatoContenitoreId":"3508"
          }],
  "data":"350800000",
  "tipoAggregatoEnum":"R",
  "statoEnum":"aperto",
  "keyData":"1360602720000",
  "keyNome":"1aasscognome_nome.111.2231",
  "nomeAggregatoNoNumero":"1AASSCOGNOME_NOME.111.2231",
  "keyNumero":"1AASSCOGNOME_NOME.111.2231",
  "keyTipo":"R",
  "originalAggregatoId":"3508",
  "originalAggregatoPadre":"3108"
}

標準的な動作として、ESB は着信 json メッセージを xml 形式のメッセージに変換します。今私が欲しいoutSequenceで:

1) RestService 応答をクライアントに送り返す: メディエーターによる

2)次に、メッセージ ペイロードからいくつかの要素を抽出する xml メッセージを作成し、それを jms プロトコルで別の場所に送信したいと考えています。

プロキシは、PayloadFactory メディエーター以外はすべて正常に動作します。実際、Payload Factory メディエーターによって作成されたメッセージの本文は空です。

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<Body>
  <code xmlns="http://ws.apache.org/ns/synapse"/>
</Body>
</soapenv:Envelope>

指定された arg タグが空である理由を誰か教えてもらえますか (xpath 式は正しいようです)。どうしたの?ありがとう

4

1 に答える 1

0

多分私は解決しました。アウトシーケンスでは、2 つのメッセージを送信する必要があります。

<send/> 

サービスの応答を呼び出し元のクライアントに返す必要があります。この後、別の場所に 2 番目のメッセージを送信する必要があります。上記のコードでは、別の送信メディエーターを使用しました...しかし、最初の () がメッセージ ペイロードを空にするように見えるため、arg 式は結果として空になります。クローンメディエーターを使用して問題を解決しました:

<outSequence>
     <log>
        <property name="codice" expression="//codice"/>
     </log>
     <log level="full"/>
     <switch source="//codice">
        <case regex="asd">
           <send/>
        </case>
        <case regex="0">
           <log>
              <property name="codice" value="check1"/>
           </log>
           <clone>
              <target>
                 <sequence>
                    <send/>
                 </sequence>
              </target>
              <target>
                 <sequence>
                    <payloadFactory media-type="xml">
                       <format>
                          <messaggio>$1</messaggio>
                       </format>
                       <args>
                          <arg xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" evaluator="xml"
                               expression="//messaggio"/>
                       </args>
                    </payloadFactory>
                    <property name="messageType" value="application/xml"/>
                    <log level="full"/>
                    <send>
                       <endpoint>
                          <address uri="jms:/NuovoEvento?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&java.naming.provider.url=repository/conf/jndi.properties&transport.jms.DestinationType=topic"/>
                       </endpoint>
                    </send>
                 </sequence>
              </target>
           </clone>
        </case>
     </switch>
  </outSequence>
于 2013-10-29T10:33:07.590 に答える