【问题标题】:Apache Synapse/WSO2 API No responseApache Synapse/WSO2 API 无响应
【发布时间】:2016-04-15 19:22:13
【问题描述】:

我想向数据库发送一个查询,并使用 WSO2 rest api 将结果返回给客户端。这是突触配置:

<api xmlns="http://ws.apache.org/ns/synapse" name="RestDBLookup" context="/dblookup">
   <resource methods="POST GET" uri-template="/channel/{name}" protocol="http">
      <inSequence>
         <dblookup>
            <connection>
               <pool>
                  <password>pass</password>
                  <driver>oracle.jdbc.driver.OracleDriver</driver>
                  <url>jdbc:oracle:thin:@localhost:1521:ORCL</url>
                  <user>user</user>
               </pool>
            </connection>
            <statement>
               <sql>SELECT ID, CHANNEL_NAME FROM CHANNEL where CHANNEL_NAME = ?</sql>
               <parameter expression="get-property('uri.var.name')" type="VARCHAR"/>
               <result name="channel_id" column="ID"/>
            </statement>
         </dblookup>
         <log level="custom">
            <property name="ID" expression="get-property('channel_id')"/>
            <property name="State" value="after db"/>
         </log>
      </inSequence>
      <outSequence>
         <property name="messageType" value="application/json" scope="axis2" type="STRING"/>
         <log level="full"/>
         <send/>
      </outSequence>
      <faultSequence/>
   </resource>
</api>

当我用 rest 客户端调用 url http://localhost:8280/dblookup/channel/someChannel 时,我在 dblookup 之后得到日志

LogMediator ID = 40810162, State = after db

但是outSequence 没有执行,我只在没有正文的其余客户端上得到状态 202 Accepted。

所以问题是如何构造一些响应(例如 JSON 格式)并将其发送给客户端?

【问题讨论】:

    标签: api rest wso2 wso2esb synapse


    【解决方案1】:

    突触调解具有三个流程:

    • inSequence - 处理即将到来的请求并定义请求的方式 应该在发送到目标端点之前处理(调解)
    • outSequence - 处理从端点返回的响应,并定义在发送到客户端之前应如何处理(调解)响应
    • faultSequence - 如果在服务调解期间发生错误,则将故障消息移交给故障序列。您可以根据您的要求(记录错误、丢弃消息和发回故障)按故障顺序编写逻辑。

    现在让我们看看您的用例。您要做的是在 inSequence 中查询数据库。你也得到了结果。但问题是结果没有发回给客户。这里的问题是您在 inSequence 中编写的中介没有调用 outSequence。因此 outSequence 没有受到打击。例如,如果您在 inSequence 中调用后端服务,则响应命中 outSequence。在您的情况下,请返回到 inSequence。因此,我们可以执行以下任一选项:

    1. 在 inSequence 中的 &lt;/log&gt; 中介之后添加 &lt;loopback/&gt; 中介。 这会将消息从 inSequence 移动到 outSequence。
    2. 将写在 outSequence 中的逻辑移动到 inSequence。然后加 &lt;respond/&gt; 在 inSequence 的末尾。这将发送电流 消息返回给客户端。所以你可能不需要 outSequence。

    希望以上答案对您有所帮助。

    干杯!

    【讨论】:

      【解决方案2】:

      正如 Indika 建议的那样,我使用了 &lt;respond/&gt; 并最终得到了这个配置:

      <api context="/dblookup" name="RestDBLookup" xmlns="http://ws.apache.org/ns/synapse">
        <resource methods="POST GET" protocol="http" uri-template="/channel/{name}">
          <inSequence>
            <dblookup>
              <connection>
                <pool>
                  <password>pass</password>
                  <driver>oracle.jdbc.driver.OracleDriver</driver>
                  <url>jdbc:oracle:thin:@localhost:1521:ORCL</url>
                  <user>user</user>
                </pool>
              </connection>
              <statement>
                <sql><![CDATA[SELECT ID, CHANNEL_NAME FROM CHANNEL where CHANNEL_NAME = ?]]></sql>
                <parameter expression="get-property('uri.var.name')" type="VARCHAR"/>
                <result column="ID" name="channel_id"/>
              </statement>
            </dblookup>
            <log level="custom">
              <property expression="get-property('channel_id')" name="ID"/>
              <property name="State" value="after db"/>
            </log>
            <payloadFactory media-type="json">
              <format>
                     {
                        "channelId":"$1"
                     }
                  </format>
              <args>
                <arg evaluator="xml" expression="get-property('channel_id')"/>
              </args>
            </payloadFactory>
            <property action="remove" name="NO_ENTITY_BODY" scope="axis2"/>
            <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
            <respond/>
          </inSequence>
          <outSequence/>
          <faultSequence/>
        </resource>
      </api>
      

      【讨论】:

        猜你喜欢
        • 2013-12-31
        • 2013-03-24
        • 2015-08-22
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 2015-02-27
        • 1970-01-01
        相关资源
        最近更新 更多