Hi,

I am working on enabling streaming xml events from OMElement inside ESB
Smooks Mediator. This is to process large messages through Smooks mediator.
Previously Smooks mediator used to build the message envelop as
*synCtx.getEnvelope().build()
*(synCtx is the MessageContext ) before processing the message. Since it
builds the element inside memory, I removed that step.

I used to test the new streaming implementation with two scenarios.

Scenario 1 :- Input message is read from the VFS transport, and streamed to
Smooks mediator. Inside that message is processed by smooks and child
elements from the MessageContext is detached & transformed element it added
to MessageContext. This worked successfully. The ESB configuration sequence
is,

<inSequence>
                <smooks config-key="smooks-key">
                    <input type="xml"/>
                    <output type="xml"/>
                </smooks>
</inSequence>
</outSequence>

Scenario 2 :- A proxy service to a DSS endpoint and its response is
processed by smooks mediator in outSequence.
<endpoint>
           <address uri="http://localhost:9765/services/OrderDetails"; />
</endpoint>
<outSequence>
           <smooks config-key="smooks-key">
                    <input type="xml" />
                    <output type="xml" />
           </smooks>
           <send />
  </outSequence>

After smooks processing the message, the child elements from the
MessageContext envelop is detached and new transformed message is added.
But when iterating through the MessageContext and calling next(),
OMException is thrown as follows.

*org.apache.axiom.om.OMException
    at
org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:212)
    at
org.apache.axiom.soap.impl.llom.SOAPBodyImpl.buildNext(SOAPBodyImpl.java:171)
    at
org.apache.axiom.om.impl.llom.OMNodeImpl.getNextOMSibling(OMNodeImpl.java:122)
    at
org.apache.axiom.om.impl.llom.OMElementImpl.getNextOMSibling(OMElementImpl.java:343)
    at
org.apache.axiom.om.impl.traverse.OMChildElementIterator.next(OMChildElementIterator.java:104)
    at
org.wso2.carbon.mediator.transform.Output.setXMLPayload(Output.java:208)
    at org.wso2.carbon.mediator.transform.Output.process(Output.java:84)
    at
org.wso2.carbon.mediator.transform.SmooksMediator.mediate(SmooksMediator.java:94)
    at
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:60)
    at
org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:114)
    at
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:219)
    at
org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:370)
    at
org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:160)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
    at
org.apache.synapse.transport.nhttp.ClientWorker.run(ClientWorker.java:275)
    at
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:173)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)*

The issue is why only the second scenario can not access the MessageContext
after smooks has processed the message. Adding back the
*synCtx.getEnvelope().build()
*solves this issue, but large messages can not be processed that way. Can
anybody kindly look into this issue and explain why is it required to build
up the message?

Thanks,
Lakmali


-- 
Lakmali Baminiwatta*
*
Software Engineer
WSO2, Inc.: http://wso2.com
lean.enterprise.middleware
mobile:  +94 71 2335936
*
*
_______________________________________________
Carbon-dev mailing list
Carbon-dev@wso2.org
http://mail.wso2.org/cgi-bin/mailman/listinfo/carbon-dev

Reply via email to