0

我正在尝试向作为 API 公开的服务添加缓存功能,以便重复请求将获得缓存响应。但是,中介不是缓存响应,而是向我返回客户端发送的消息。
下面是我的api的配置。它描述了一个get资源,它接收两个查询参数并使用它们创建一个payoad,它发送到本地dss服务:

    <?xml version="1.0" encoding="UTF-8"?>
<api context="/config" name="myAPI" xmlns="http://ws.apache.org/ns/synapse">
    <resource methods="GET">
        <inSequence>
            <cache collector="false" hashGenerator="org.wso2.carbon.mediator.cache.digest.DOMHASHGenerator" id="testCache" scope="per-mediator" timeout="200">
                <onCacheHit/>
                <implementation maxSize="100" type="memory"/>
            </cache>
            <property expression="$url:intg" name="uri.integration" scope="default" type="STRING"/>
            <property expression="$url:inst" name="uri.institution" scope="default" type="STRING"/>
            <payloadFactory media-type="xml">
                <format>
                    <con:show xmlns:con="http://com.dvg.wso2/configservice">
                        <con:SEL_INTG_NAME>$1</con:SEL_INTG_NAME>
                        <con:SEL_INSTITUTION>$2</con:SEL_INSTITUTION>
                    </con:show>
                </format>
                <args>
                    <arg evaluator="xml" expression="get-property('uri.integration')"/>
                    <arg evaluator="xml" expression="get-property('uri.institution')"/>
                </args>
            </payloadFactory>
            <header name="Action" scope="default" value="urn:show"/>
            <send>
                <endpoint>
                    <address format="soap11" uri="local:///services/INTG_DVG_ConfigService/"/>
                </endpoint>
            </send>
        </inSequence>
        <outSequence>
            <cache collector="true" scope="per-mediator" id="testCache"/>
            <send/>
        </outSequence>
        <faultSequence/>
    </resource>
</api>

我的预期输出应该是这样的:

<soapenv:Body>
    <properties>
        <property>
          <key>A</key>
          <value>A</value>
        </property>
    </properties>
</soapenv:Body>

但我收到这样的缓存响应:

<con:show xmlns:con="http://com.dvg.wso2/configservice"><con:SEL_INTG_NAME>A</con:SEL_INTG_NAME><con:SEL_INSTITUTION>A</con:SEL_INSTITUTION></con:show>

这是我按顺序创建的有效负载的内容。应该说明的是,在缓存未命中的情况下,我会收到预期的响应。

按原样配置的缓存调解器不应该存储缓存未命中的响应并在缓存命中的情况下返回它吗?
为什么它响应错误的内容?

--- 编辑 ---
在更改了 org.wso2.carbon.mediator.cache.CacheMediator 日志的配置后,我能够确认缓存中介确实在保存和恢复输入消息而不是响应。
如果我尝试在 proxyService 中仅在 API 中重现此行为,则不会发生此行为。

4

1 回答 1

0

我无法让缓存调解器在 api 中工作,但我观察到它在代理服务中实现时的行为符合预期。
所以我最终重构了我的集成,以便 api 会调用代理服务,然后这个代理会在调用 dss 服务之前验证缓存。
由于对代理和 dss 的调用使用本地传输,因此对性能没有太大影响。
如果将来有人阅读本文,并对如何在 api 服务上正确使用缓存中介有一些见解,请发表评论。

于 2017-05-09T12:59:02.733 回答