WSO2 MI – 无法在处理base64编码的载荷时写入JSON流
我正在使用 WSO2 Micro Integrator,并暴露一个PATCH API,用于接收一个 JSON载荷中的base64文档,然后把它转发给后端服务。
<resource methods="PATCH" uri-template="/uploadDocuments">
<inSequence>
<log category="INFO" level="custom">
<property name="[UPLOADING DOCUMENT]" value="[STARTED]" />
</log>
<sequence key="ApiKeySequence" />
<propertyGroup>
<property name="uri.var.stagingUrl" scope="default" type="STRING"
expression="concat(get-property('env', 'staging_baseUrl'), 'docs/upload')"
action="set" />
</propertyGroup>
<log category="INFO" level="custom">
<property name="Calling SFDL staging to upload document" value="[CALLING...]" />
</log>
<call>
<endpoint key="stagingPatchService" />
</call>
<log category="INFO" level="custom">
<property name="Http code" expression="$axis2:HTTP_SC" />
<property name="Response" expression="json-eval($)" />
</log>
<log category="INFO" level="custom">
<property name="[UPLOADING DOCUMENT]" value="[ENDED]" />
</log>
<respond />
</inSequence>
<faultSequence>
<sequence key="defaultFaultSequence" />
<payloadFactory media-type="json">
<format>{ "returnCode": "$1", "returnMessage": "$2" }</format>
<args>
<arg evaluator="xml" expression="get-property('ERROR_CODE')" />
<arg evaluator="xml" expression="get-property('ERROR_MESSAGE')" />
</args>
</payloadFactory>
<property name="HTTP_SC" expression="get-property('HTTP_SC')" />
<log category="INFO" level="custom">
<property name="Http code" expression="$axis2:HTTP_SC" />
<property name="Response" expression="json-eval($)" />
</log>
<log category="INFO" level="custom">
<property name="[UPLOADING DOCUMENT]" value="[ENDED]" />
</log>
<respond />
</faultSequence>
</resource>
日志:
[2026-03-26 11:14:37,400] INFO {LogMediator} - {api:SamsungApi} [UPLOADING DOCUMENT] = [ENDED]
[2026-03-26 11:14:37,400] ERROR {JsonUtil} - #writeJsonStream. Could not write JSON stream. MessageID: urn:uuid:65c1e235-6645-4d37-b542-cb3424f96877. Error>> Consumer error or stale connection has occurred.
[2026-03-26 11:14:37,400] ERROR {JsonStreamFormatter} - Error occurred while writing to application/json java.lang.reflect.InvocationTargetException
at jdk.internal.reflect.GeneratedMethodAccessor47.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.wso2.micro.integrator.core.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:109)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:597)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:293)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:220)
at org.apache.synapse.mediators.builtin.RespondMediator.mediate(RespondMediator.java:46)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:126)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:74)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
at org.apache.synapse.mediators.MediatorFaultHandler.onFault(MediatorFaultHandler.java:96)
at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:114)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:107)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:401)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:460)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:208)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: org.apache.axis2.AxisFault: Could not write JSON stream.
at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:400)
at org.apache.synapse.commons.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:77)
... 23 more
Caused by: org.apache.axis2.AxisFault: Could not write JSON stream.
at org.apache.synapse.commons.json.JsonUtil.writeJsonStream(JsonUtil.java:1242)
at org.apache.synapse.commons.json.JsonUtil.writeAsJson(JsonUtil.java:388)
... 24 more
Caused by: java.io.IOException: Consumer error or stale connection has occurred.
at org.apache.synapse.transport.passthru.Pipe$ByteBufferOutputStream.write(Pipe.java:665)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1310)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:978)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1282)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:953)
at org.apache.synapse.commons.json.JsonUtil.writeJsonStream(JsonUtil.java:1218)
... 25 more
[2026-03-26 11:14:37,403] ERROR {PassThroughHttpSender} - Failed to submit the response org.apache.axis2.AxisFault
at org.wso2.micro.integrator.core.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:113)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:597)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:293)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:220)
at org.apache.synapse.mediators.builtin.RespondMediator.mediate(RespondMediator.java:46)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:126)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:74)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
at org.apache.synapse.mediators.MediatorFaultHandler.onFault(MediatorFaultHandler.java:96)
at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:114)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:107)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:401)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:460)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:208)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)
[2026-03-26 11:14:37,405] ERROR {Axis2Sender} - {api:SamsungApi} Accept:application/json,Accept-Encoding:gzip,Access-Control-Allow-Headers:,Access-Control-Allow-Methods:PATCH,Access-Control-Allow-Origin:,activityid:17b9f8cd-b52e-4872-b6ab-8a5e93c2228d,Authorization:(just header informations), Unexpected error sending message back org.apache.axis2.AxisFault: Failed to submit the response
at org.apache.synapse.transport.passthru.PassThroughHttpSender.handleException(PassThroughHttpSender.java:691)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:295)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:220)
at org.apache.synapse.mediators.builtin.RespondMediator.mediate(RespondMediator.java:46)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:126)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:74)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
at org.apache.synapse.mediators.MediatorFaultHandler.onFault(MediatorFaultHandler.java:96)
at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:114)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:107)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:401)
at org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:460)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:208)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: org.apache.axis2.AxisFault
at org.wso2.micro.integrator.core.json.JsonStreamFormatter.writeTo(JsonStreamFormatter.java:113)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:597)
at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:293)
... 17 more
[2026-03-26 11:14:37,517] INFO {LogMediator} - {api:SamsungApi} To: , MessageID: urn:uuid:65c1e235-6645-4d37-b542-cb3424f96877, correlation_id: 17b9f8cd-b52e-4872-b6ab-8a5e93c2228d, Direction: response, MESSAGE = Executing default 'fault' sequence, ERROR_CODE = 050, ERROR_MESSAGE = Your request is not suitable. for more info contact the support., Payload: { "returnCode": "050", "returnMessage": "Your request is not suitable. for more info contact the support." }
[2026-03-26 11:14:37,544] INFO {LogMediator} - {api:SamsungApi} Http code = 201, Response = {"returnCode":"000","returnMessage":"Success"}
[2026-03-26 11:14:37,544] INFO {LogMediator} - {api:SamsungApi} [UPLOADING DOCUMENT] = [ENDED]
编辑(31-03-26):请使用此日志 日志文件
这个错误并不常发生。
看起来请求已经发送到后端,但同时出现了一个错误。
WSO2 Micro Integrator版本4.3.0
解决方案
这既不是后端错误,也不是中介层的错误。在WSO2 Micro Integrator中,当无法将响应写回客户端时,会发生这种情况。
你的日志显示后端调用成功(HTTP 201),失败发生在稍后的阶段:
JsonStreamFormatter.writeTo
PassThroughHttpSender.submitResponse
与
Consumer error or stale connection has occurred
这意味着在MI尝试发送响应时,HTTP连接已经不可用。这可能因为客户端超时、网络中断、较大的载荷(例如base64)导致的慢速流式传输,或在记录日志时使用 json-eval($),从而强制完整消息的构建。
因此,你可以尝试:
- 移除或避免记录完整载荷(
json-eval($)) - 提高客户端/传输超时
- 尝试使用更小的载荷
可选地禁用分块传输
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。