Apache Synapse/WSO2 API 无响应
Apache Synapse/WSO2 API No response
我想向数据库发送一个查询,然后 return 使用 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
没有被执行,我只在没有正文的其余客户端上得到 Status 202 Accepted。
所以问题是我如何构造一些响应(例如 JSON 格式)并将其发送给客户端?
突触中介具有三个流程:
- inSequence - 处理即将到来的请求并定义请求方式
应该在发送到目标端点之前进行处理(调解)
- outSequence - 处理从端点返回的响应并定义在发送到客户端之前应如何处理(调解)响应
- faultSequence - 如果在服务调解期间发生错误,则向故障序列发送故障消息 hand-over。您可以根据您的要求(记录错误、丢弃消息和发回故障)按故障顺序写下逻辑。
现在让我们看看你的 use-case。您要做的是在 inSequence 中查询数据库。你也会得到结果。但问题是结果没有发回给客户。这里的问题是您在 inSequence 中编写的中介没有调用 outSequence。因此 outSequence 不会被击中。例如,如果您在 inSequence 中调用后端服务,则响应命中到 outSequence。在您的情况下,响应返回到 inSequence。因此,我们可以执行以下任一选项:
- 在 inSequence 中的
</log>
调解器之后添加 <loopback/>
调解器。
这会将消息从 inSequence 移动到 outSequence。
- 将写在outSequence中的逻辑移到inSequence中。然后加
<respond/>
在 inSequence 的末尾。这将发送电流
消息返回给客户端。所以你可能不需要 outSequence.
希望以上回答对您有所帮助。
干杯!
正如 Indika 所建议的,我使用了 <respond/>
并最终得到了这个配置:
<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":""
}
</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>
我想向数据库发送一个查询,然后 return 使用 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
没有被执行,我只在没有正文的其余客户端上得到 Status 202 Accepted。
所以问题是我如何构造一些响应(例如 JSON 格式)并将其发送给客户端?
突触中介具有三个流程:
- inSequence - 处理即将到来的请求并定义请求方式 应该在发送到目标端点之前进行处理(调解)
- outSequence - 处理从端点返回的响应并定义在发送到客户端之前应如何处理(调解)响应
- faultSequence - 如果在服务调解期间发生错误,则向故障序列发送故障消息 hand-over。您可以根据您的要求(记录错误、丢弃消息和发回故障)按故障顺序写下逻辑。
现在让我们看看你的 use-case。您要做的是在 inSequence 中查询数据库。你也会得到结果。但问题是结果没有发回给客户。这里的问题是您在 inSequence 中编写的中介没有调用 outSequence。因此 outSequence 不会被击中。例如,如果您在 inSequence 中调用后端服务,则响应命中到 outSequence。在您的情况下,响应返回到 inSequence。因此,我们可以执行以下任一选项:
- 在 inSequence 中的
</log>
调解器之后添加<loopback/>
调解器。 这会将消息从 inSequence 移动到 outSequence。 - 将写在outSequence中的逻辑移到inSequence中。然后加
<respond/>
在 inSequence 的末尾。这将发送电流 消息返回给客户端。所以你可能不需要 outSequence.
希望以上回答对您有所帮助。
干杯!
正如 Indika 所建议的,我使用了 <respond/>
并最终得到了这个配置:
<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":""
}
</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>