On Wed, Jul 27, 2011 at 13:22, Sadeep Jayasumana <gayansad...@gmail.com> wrote:
> Hi,
>
> On Wed, Jul 27, 2011 at 4:12 PM, Andreas Veithen <andreas.veit...@gmail.com>
> wrote:
>>
>> On Wed, Jul 27, 2011 at 04:45, Sadeep Jayasumana <gayansad...@gmail.com>
>> wrote:
>> > Hi,
>> >> Whether streaming is possible or not depends on how the
>> >> MIME parts are accessed, but you always need to support buffering if
>> >> necessary.
>> > Yes, existing functionality will not be broken. In fact, building the
>> > Part
>> > in memory will be the default behavior. Streaming will kick in only if
>> > it is
>> > explicitly enabled.
>> >> The Attachments object is one of the first things that will be created
>> >> when a new message is received. Therefore nobody will be able to set a
>> >> property in the message context, i.e. the setting would necessarily be
>> >> a global property in axis2.xml. This however is a problem if you have
>> >> services with diverging requirements. The decision to buffer or not
>> >> the content of the MIME part can't be taken at this stage in the
>> >> processing. It can only be taken when the MIME part is actually
>> >> accessed (which includes serializing the message to forward it)
>> > I agree with your comment. This functionality could be provided by
>> > introducing a new method, setAttachmentStreaming(), to Attachments class
>> > or
>> > MessageContext class. However, I'm wondering whether it is
>> > an elegant way of
>> > doling this. Other ways of doing the same involves significant
>> > modifications
>> > to Axiom API.
>>
>> I don't think so. The desired way of doing this would be to have an
>> Axiom specific subclass of DataHandler (or a DataHandler backed by an
>> Axiom specific implementation of DataSource?) with a method such as:
>>
>> InputStream getInputStream(boolean preserve)
>
> Coming back to our original problem, we need SOAPMessageFormatter to stream
> attachments when attachment streaming is explicitly enabled (via a
> configuration parameter or a message context property). If we introduce such
> a new API method, calling it from the SOAPMessageFormatter would involve
> adding number of new methods to different classes.
> Thanks,
> Sadeep

Nope. The code in SOAPMessageFormatter that is responsible for the
MTOM case is as follows:

                OMElement element = msgCtxt.getEnvelope();
                if (preserve) {
                    element.serialize(out, format);
                } else {
                    element.serializeAndConsume(out, format);
                }

One would simply extend the concept of "consume" to the MIME parts and
the magic would happen behind the scenes inside Axiom. The SwA case is
a bit different because Axis2 will manipulate the attachments
directly. However, I don't think that covering that case requires
introducing new methods in lots of different places.

>>
>> Probably we would have to introduce a couple of new APIs to make this
>> work behind the scene, but it would not imply modification of existing
>> APIs. Existing application code would continue to work as usual
>> (except maybe in the case of a missing MIME part) and the decision to
>> stream or not is taken just in time.
>>
>> > Thanks,
>> > Sadeep
>> > On Tue, Jul 26, 2011 at 12:03 AM, Andreas Veithen
>> > <andreas.veit...@gmail.com> wrote:
>> >>
>> >> Some time ago I was thinking about this issue. It is highly non
>> >> trivial to solve. Consider the following variant of your example:
>> >>
>> >>      public void useBinaryData(DataHandler dh1, DataHandler dh2) {
>> >>          try {
>> >>              OutputStream out = new FileOutputStream(new
>> >> File("output1.zip"));
>> >>              dh1.writeTo(out);
>> >>              out = new FileOutputStream(new File("output2.zip"));
>> >>              dh2.writeTo(out);
>> >>          } catch (IOException e) {
>> >>              throw new RuntimeException(e);
>> >>          }
>> >>      }
>> >>
>> >> Taking into account that the client is not required to send the MIME
>> >> parts in any particular order and that the service is not required to
>> >> consume them in any particular order, you will always end up with
>> >> scenarios where you have no other choice than to buffer some of the
>> >> MIME parts. Whether streaming is possible or not depends on how the
>> >> MIME parts are accessed, but you always need to support buffering if
>> >> necessary.
>> >>
>> >> What this example also shows is that you need to defer the calls to
>> >> Attachments#getDataHandler(String) until the very last moment. When
>> >> working with an Axiom tree, this is already the case: the call to
>> >> Attachments#getDataHandler(String) occurs when OMText#getDataHandler()
>> >> is called (and not when the OMText node is built). However, when using
>> >> a data binding, one would have to create some sort of DataHandler
>> >> proxy that defers the call to Attachments#getDataHandler(String).
>> >>
>> >> Andreas
>> >>
>> >> On Mon, Jul 25, 2011 at 09:21, Sadeep Jayasumana
>> >> <gayansad...@gmail.com>
>> >> wrote:
>> >> > Hi Devs,
>> >> > Here is the benefit of this feature from Axis2's perspective.
>> >> >
>> >> > Currently, when I use Axis2 to deploy a service class as follows,
>> >> > public class MTOMService {
>> >> >     public void useBinaryData(String username, DataHandler
>> >> > dataHandler)
>> >> > {
>> >> >         try {
>> >> >             System.out.println("Name : " + username); // line1
>> >> >             OutputStream out = new FileOutputStream(new
>> >> > File("output.zip"));
>> >> >             dataHandler.writeTo(out); // line2
>> >> >             System.out.println("Saving done!");
>> >> >         } catch (IOException e) {
>> >> >             throw new RuntimeException(e);
>> >> >         }
>> >> >     }
>> >> > }
>> >> > the entire attachment is loaded before useBinaryData() method is
>> >> > called.
>> >> > Therefore, when a large attachment is used execution of line 1 will
>> >> > be significantly delayed.
>> >> > However, when the suggested feature is implemented, stream will be
>> >> > read
>> >> > only
>> >> > when it is absolutely needed (i.e., in line 2). Therefore, execution
>> >> > of
>> >> > line1 will happen right after receiving the client request.
>> >> > Enabling attachment streaming will be similar to enabling file
>> >> > caching
>> >> > of attachments [1], an axis2.xml parameter or MessageContext property
>> >> > could
>> >> > be used.
>> >> > [1] http://axis.apache.org/axis2/java/core/docs/mtom-guide.html#a41
>> >> > Thanks,
>> >> > Sadeep
>> >> >
>> >> > On Mon, Jul 25, 2011 at 11:46 AM, Sadeep Jayasumana
>> >> > <gayansad...@gmail.com>
>> >> > wrote:
>> >> >>
>> >> >> Hi Devs,
>> >> >> In Apache Syanpse, we have a requirement to proxy an MTOM enabled
>> >> >> web
>> >> >> service with minimum overhead. Large files (even in GB range) should
>> >> >> be
>> >> >> able
>> >> >> to go through Synapse without running it OOM.
>> >> >> To satisfy this requirement, Synapse should be able to forward an
>> >> >> incoming
>> >> >> SOAP message with MTOM attachments to the backend service without
>> >> >> building
>> >> >> the attachments. Synapse might read/modify the SOAP envelop but not
>> >> >> the
>> >> >> attachments. Therefore, it should be possible to stream attachments
>> >> >> directly
>> >> >> from the Synpase's client to the backend service.
>> >> >> However, in the current implementation of AXIOM and Axis2, MTOM
>> >> >> attachments are built (in memory or in a file) by
>> >> >> SOAPMessageFormatter.
>> >> >> This
>> >> >> caused Synapse to run OOM when in the above mentioned scenario.
>> >> >> I have come up with a fix for this. It is to introduce a
>> >> >> new org.apache.axiom.attachments.impl.AbstractPart implementation
>> >> >> which
>> >> >> streams non-soap MIME parts without building them.
>> >> >> To introduce this new feature without breaking existing stuff, I'm
>> >> >> planning to introduce a new message context property which enables
>> >> >> MTOM
>> >> >> streaming. org.apache.axis2.builder.BuilderUtils class will check
>> >> >> this
>> >> >> property in the message context and
>> >> >> create org.apache.axiom.attachments.Attachments
>> >> >> object accordingly. Does
>> >> >> this sound like the correct way of introducing this feature?
>> >> >> Appreciate your feedback.
>> >> >> Thanks,
>> >> >> --
>> >> >> Sadeep Jayasumana
>> >> >> Software Engineer,
>> >> >> WSO2 Inc.
>> >> >
>> >> > --
>> >> > Sadeep Jayasumana
>> >> > Software Engineer,
>> >> > WSO2 Inc.
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: java-dev-unsubscr...@axis.apache.org
>> >> For additional commands, e-mail: java-dev-h...@axis.apache.org
>> >>
>> >
>> >
>> >
>> > --
>> > Sadeep
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: java-dev-unsubscr...@axis.apache.org
>> For additional commands, e-mail: java-dev-h...@axis.apache.org
>>
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscr...@axis.apache.org
For additional commands, e-mail: java-dev-h...@axis.apache.org

Reply via email to