Ok.  Attached is the new version using a byte[] to
store the mime message.  The other change is in
MailImpl.java to instantiate the new class. 
Performance went from ~5500 10.9kB messages/min to
~6800 messages/min.

--- Gabor Kincses <[EMAIL PROTECTED]> wrote:

> Why?  Is it the synchronization overhead?
> 
> Which one should I use?  I'm not finding anything
> other than the java.io.
> 
> Thanks,
> Gabor
> 
> --- Serge Knystautas <[EMAIL PROTECTED]> wrote:
> 
> > Gabor Kincses wrote:
> > > Ok, I found it.  MimeMessageInputStreamSource
> > should
> > > really be called
> MimeMessageFileInputStreamSource,
> > > then a MimeMessageByteArrayInputStreamSource
> could
> > be
> > > written, which stores the freshly parsed out
> > message
> > > in  a static hash of ByteArrayInputStreams
> instead
> > of
> > > temp files.  The dispose method would remove the
> > entry
> > > from the hash.
> > 
> > Sounds good, though I'd recommend using commons
> io's
> > 
> > bytearrayoutputstream instead of the one with the
> > JDK.
> > 
> > -- 
> > Serge Knystautas
> > Lokitech >> software . strategy . design >>
> > http://www.lokitech.com
> > p. 301.656.5501
> > e. [EMAIL PROTECTED]
> > 
> >
>
---------------------------------------------------------------------
> > To unsubscribe, e-mail:
> > [EMAIL PROTECTED]
> > For additional commands, e-mail:
> > [EMAIL PROTECTED]
> > 
> > 
> 
> 
> =====
> Gabor Kincses
> Running Mandrake Linux 10.0
> 
> 
>               
> __________________________________ 
> Do you Yahoo!? 
> Yahoo! Mail - now with 250MB free storage. Learn
> more.
> http://info.mail.yahoo.com/mail_250
> 
>
---------------------------------------------------------------------
> To unsubscribe, e-mail:
> [EMAIL PROTECTED]
> For additional commands, e-mail:
> [EMAIL PROTECTED]
> 
> 

=====
Gabor Kincses
Running Mandrake Linux 10.0


        
                
__________________________________ 
Do you Yahoo!? 
Yahoo! Mail - You care about security. So do we. 
http://promotions.yahoo.com/new_mail
/***********************************************************************
 * Copyright (c) 2000-2004 The Apache Software Foundation.             *
 * All rights reserved.                                                *
 * ------------------------------------------------------------------- *
 * Licensed under the Apache License, Version 2.0 (the "License"); you *
 * may not use this file except in compliance with the License. You    *
 * may obtain a copy of the License at:                                *
 *                                                                     *
 *     http://www.apache.org/licenses/LICENSE-2.0                      *
 *                                                                     *
 * Unless required by applicable law or agreed to in writing, software *
 * distributed under the License is distributed on an "AS IS" BASIS,   *
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
 * implied.  See the License for the specific language governing       *
 * permissions and limitations under the License.                      *
 ***********************************************************************/

package org.apache.james.core;

import java.io.*;

import javax.mail.MessagingException;

import org.apache.avalon.framework.activity.Disposable;

/**
 * Takes an input stream and creates a repeatable input stream source
 * for a MimeMessageWrapper.  It does this by completely reading the
 * input stream and saving that to a temporary file that should delete on exit,
 * or when this object is GC'd.
 *
 * @see MimeMessageWrapper
 *
 *
 */
public class MimeMessageByteArrayInputStreamSource
    extends MimeMessageSource
    implements Disposable {
    
    /**
     * Random key into the cache
     */
    String sourceId = null;

    /**
     * The mime bytes
     */
    byte[] bytes = null;
    
    /**
     * @param key
     * @param in
     * @throws MessagingException
     */
    /**
     * Construct a new MimeMessageByteArrayInputStreamSource from an
     * <code>InputStream</code> that contains the bytes of a
     * MimeMessage.
     *
     * @param key the prefix for the name of the temp file
     * @param in the stream containing the MimeMessage
     *
     * @throws MessagingException if an error occurs while trying to store
     *                            the stream
     */
    public MimeMessageByteArrayInputStreamSource(String key, InputStream in)
            throws MessagingException {
        //We want to immediately read this into a byte array
        //Create a byte array and channel the input stream into it
        OutputStream out = null;
        ByteArrayOutputStream bout = null;
        try {
            out = new BufferedOutputStream(bout = new ByteArrayOutputStream());
            int b = -1;
            while ((b = in.read()) != -1) {
                out.write(b);
            }
            out.flush();
            sourceId = key;
            bytes =  bout.toByteArray();
        } catch (IOException ioe) {
            throw new MessagingException("Unable to retrieve the data: " + ioe.getMessage(), ioe);
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException ioe) {
                // Ignored - logging unavailable to log this non-fatal error.
            }

            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ioe) {
                // Ignored - logging unavailable to log this non-fatal error.
            }
        }
    }

    /**
     * Returns the unique identifier of this input stream source
     *
     * @return the unique identifier for this MimeMessageByteArrayInputStreamSource
     */
    public String getSourceId() {
        return sourceId;
    }

    /**
     * Get an input stream to retrieve the data stored in the temporary file
     *
     * @return a <code>BufferedInputStream</code> containing the data
     */
    public synchronized InputStream getInputStream() throws IOException {
        return new BufferedInputStream(new ByteArrayInputStream(bytes));
    }

    /**
     * Get the size of the temp file
     *
     * @return the size of the temp file
     *
     * @throws IOException if an error is encoutered while computing the size of the message
     */
    public long getMessageSize() throws IOException {
        return bytes.length;
    }

    /**
     * @see org.apache.avalon.framework.activity.Disposable#dispose()
     */
    public void dispose() {
        bytes = null;
    }

    /**
     * <p>Finalizer that closes and deletes the temp file.  Very bad.</p>
     * We're leaving this in temporarily, while also establishing a more
     * formal mechanism for cleanup through use of the dispose() method.
     *
     */
    public void finalize() {
        dispose();
    }
}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to