wso2 ei 660。使用脚本中介时的严重错误
wso2 ei 660. Critical BUG when use script mediator
我使用了资源中的代码
<resource faultSequence="fault_simple" methods="GET" protocol="https" uri-template="/all">
<inSequence>
<property expression="get-property('SYSTEM_TIME')" name="REQUEST_TIMESTAMP" scope="default" type="STRING"/>
<send>
<endpoint key="get_balancing"/>
</send>
</inSequence>
<outSequence>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<property expression="get-property('SYSTEM_TIME')" name="RESPONSE_TIMESTAMP" scope="default" type="STRING"/>
<script language="js"><![CDATA[var requestTimeStamp = mc.getProperty("REQUEST_TIMESTAMP");
var responseTimeStamp = mc.getProperty("RESPONSE_TIMESTAMP");
var responseTime = (responseTimeStamp - requestTimeStamp)/1000;
mc.setProperty("RESPONSE_TIME", responseTime);]]>
</script>
<log>
<property expression="$ctx:RESPONSE_TIMESTAMP" name="RESPONSE_TIMESTAMP"/>
<property expression="$ctx:REQUEST_TIMESTAMP" name="REQUEST_TIMESTAMP"/>
<property expression="$ctx:RESPONSE_TIME" name="RESPONSE_TIME"/>
</log>
<send/>
</outSequence>
</resource>
当发送端点工作时间 < 1 秒时,这也有效,但如果发送工作时间超过 8-9 秒,我就会出错
INFO {org.apache.synapse.mediators.builtin.LogMediator} - To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:613d12e7-d692-4ac7-8a20-6b798f811edb, Direction: response, RESPONSE_TIMESTAMP = 1592573342279, REQUEST_TIMESTAMP = 1592573333377
ERROR {org.apache.synapse.mediators.bsf.ScriptMediator} - The script engine returned an Exception executing the external js script : null function mediate java.lang.IllegalArgumentException: out of range index
INFO {org.apache.synapse.mediators.builtin.LogMediator} - To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:613d12e7-d692-4ac7-8a20-6b798f811edb, Direction: response, MESSAGE = Executing default 'fault' sequence, ERROR_CODE = 0, ERROR_MESSAGE = The script engine returned an Exception executing the external js script : null function mediate
当我从代码中删除中介脚本时,服务也正常工作(发送工作超过 8-9 秒)
p.s。我试过使用 JS/Groovy/Python - 结果是一样的。
此错误是由于脚本中介试图读取大量响应(总是)造成的。
解决方法如下:
<resource faultSequence="fault_simple" methods="GET" protocol="https" uri-template="/all">
<inSequence>
<property expression="get-property('SYSTEM_TIME')" name="REQUEST_TIMESTAMP" scope="default" type="STRING"/>
<send>
<endpoint key="get_balancing"/>
</send>
</inSequence>
<outSequence>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<property expression="get-property('SYSTEM_TIME')" name="RESPONSE_TIMESTAMP" scope="default" type="STRING"/>
<property name="RESPONSE_TIME" scope="default" expression="$ctx:RESPONSE_TIMESTAMP - $ctx:REQUEST_TIMESTAMP"/>
<log>
<property expression="$ctx:RESPONSE_TIMESTAMP" name="RESPONSE_TIMESTAMP"/>
<property expression="$ctx:REQUEST_TIMESTAMP" name="REQUEST_TIMESTAMP"/>
<property expression="$ctx:RESPONSE_TIME" name="RESPONSE_TIME"/>
</log>
<send/>
</outSequence>
</resource>
改为 JS 脚本 - 这个
<property name="RESPONSE_TIME" scope="default" expression="$ctx:RESPONSE_TIMESTAMP - $ctx:REQUEST_TIMESTAMP"/>
我使用了资源中的代码
<resource faultSequence="fault_simple" methods="GET" protocol="https" uri-template="/all">
<inSequence>
<property expression="get-property('SYSTEM_TIME')" name="REQUEST_TIMESTAMP" scope="default" type="STRING"/>
<send>
<endpoint key="get_balancing"/>
</send>
</inSequence>
<outSequence>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<property expression="get-property('SYSTEM_TIME')" name="RESPONSE_TIMESTAMP" scope="default" type="STRING"/>
<script language="js"><![CDATA[var requestTimeStamp = mc.getProperty("REQUEST_TIMESTAMP");
var responseTimeStamp = mc.getProperty("RESPONSE_TIMESTAMP");
var responseTime = (responseTimeStamp - requestTimeStamp)/1000;
mc.setProperty("RESPONSE_TIME", responseTime);]]>
</script>
<log>
<property expression="$ctx:RESPONSE_TIMESTAMP" name="RESPONSE_TIMESTAMP"/>
<property expression="$ctx:REQUEST_TIMESTAMP" name="REQUEST_TIMESTAMP"/>
<property expression="$ctx:RESPONSE_TIME" name="RESPONSE_TIME"/>
</log>
<send/>
</outSequence>
</resource>
当发送端点工作时间 < 1 秒时,这也有效,但如果发送工作时间超过 8-9 秒,我就会出错
INFO {org.apache.synapse.mediators.builtin.LogMediator} - To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:613d12e7-d692-4ac7-8a20-6b798f811edb, Direction: response, RESPONSE_TIMESTAMP = 1592573342279, REQUEST_TIMESTAMP = 1592573333377
ERROR {org.apache.synapse.mediators.bsf.ScriptMediator} - The script engine returned an Exception executing the external js script : null function mediate java.lang.IllegalArgumentException: out of range index
INFO {org.apache.synapse.mediators.builtin.LogMediator} - To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:613d12e7-d692-4ac7-8a20-6b798f811edb, Direction: response, MESSAGE = Executing default 'fault' sequence, ERROR_CODE = 0, ERROR_MESSAGE = The script engine returned an Exception executing the external js script : null function mediate
当我从代码中删除中介脚本时,服务也正常工作(发送工作超过 8-9 秒)
p.s。我试过使用 JS/Groovy/Python - 结果是一样的。
此错误是由于脚本中介试图读取大量响应(总是)造成的。
解决方法如下:
<resource faultSequence="fault_simple" methods="GET" protocol="https" uri-template="/all">
<inSequence>
<property expression="get-property('SYSTEM_TIME')" name="REQUEST_TIMESTAMP" scope="default" type="STRING"/>
<send>
<endpoint key="get_balancing"/>
</send>
</inSequence>
<outSequence>
<property name="messageType" scope="axis2" type="STRING" value="application/json"/>
<property expression="get-property('SYSTEM_TIME')" name="RESPONSE_TIMESTAMP" scope="default" type="STRING"/>
<property name="RESPONSE_TIME" scope="default" expression="$ctx:RESPONSE_TIMESTAMP - $ctx:REQUEST_TIMESTAMP"/>
<log>
<property expression="$ctx:RESPONSE_TIMESTAMP" name="RESPONSE_TIMESTAMP"/>
<property expression="$ctx:REQUEST_TIMESTAMP" name="REQUEST_TIMESTAMP"/>
<property expression="$ctx:RESPONSE_TIME" name="RESPONSE_TIME"/>
</log>
<send/>
</outSequence>
</resource>
改为 JS 脚本 - 这个
<property name="RESPONSE_TIME" scope="default" expression="$ctx:RESPONSE_TIMESTAMP - $ctx:REQUEST_TIMESTAMP"/>