Sun SAAJ implementation is unable to perform saveChanges on SOAP message with bigger attachments (>30 Mb) .
Oct 3, 2008 4:22:17 PM com.sun.xml.messaging.saaj.soap.MessageImpl saveChanges
SEVERE: SAAJ0540: Error during saving a multipart message
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Error during saving a multipart message
at com.sun.xml.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1126)
at TestSOAPwithAttachments.main(TestSOAPwithAttachments.java:1061)
Caused by: java.lang.OutOfMemoryError: Java heap space
at com.sun.xml.messaging.saaj.util.ByteOutputStream.ensureCapacity(ByteOutputStream.java:102)
at com.sun.xml.messaging.saaj.util.ByteOutputStream.write(ByteOutputStream.java:109)
at javax.activation.DataHandler.writeTo(DataHandler.java:322)
at com.sun.xml.messaging.saaj.packaging.mime.internet.MimeBodyPart.writeTo(MimeBodyPart.java:899)
at com.sun.xml.messaging.saaj.packaging.mime.internet.MimeMultipart.writeTo(MimeMultipart.java:264)
at com.sun.xml.messaging.saaj.soap.MessageImpl.saveChanges(MessageImpl.java:1114)
Are there better SAAJ implementations for big SwA messages?
Are there anybody who have good experience with other (Axis, Spring etc) implementations?
Here is a sample code for creating, saving and restoring SwA if somebody want to test it. This code works fine with little attachments.
try
{
int i,j,n,count;
StringBuffer sb = new StringBuffer();
Iterator it;
String[] attachments = {
"./test/The Java EE5 Tutorial.pdf"
,"./test/The Java EE5 Tutorial.pdf"
,"./test/The Java EE5 Tutorial.pdf"
,"./test/The Java EE5 Tutorial.pdf"
,"./test/The Java EE5 Tutorial.pdf"
};
// creating SOAPMessage
MessageFactory messagefactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
SOAPMessage message = messagefactory.createMessage();
System.out.println("SOAPMessage created with "+messagefactory.getClass().getName()+" "+message);
// adding attachments
System.out.println("Adding attachments:");
for ( i=0; i<attachments.length; i++ )
{
File attachmentfile = new File(attachments);
DataHandler datahandler = new DataHandler(attachmentfile.toURI().toURL());
AttachmentPart attachmentpart = message.createAttachmentPart(datahandler);
attachmentpart.setContentId(attachmentfile.getName());
message.addAttachmentPart(attachmentpart);
System.out.println("\tAttachment added: "+attachmentfile+", length="+attachmentfile.length());
}
// count attachments
message.saveChanges();
count = message.countAttachments();
System.out.println("Count of attachments: "+count);
// explore MimeHeaders (1)
MimeHeaders mimeheaders1 = message.getMimeHeaders();
it = mimeheaders1.getAllHeaders();
j = 0;
System.out.println("Explored MimeHeaders (1):");
while ( it.hasNext() )
{
MimeHeader header = (MimeHeader)it.next();
String[] values = mimeheaders1.getHeader(header.getName());
sb.setLength(0);
sb.append("\t ");
sb.append("[");
sb.append(j);
sb.append("](length=");
sb.append(values.length);
sb.append(") ");
sb.append(header.getName());
sb.append(" = ");
j++;
if ( values.length == 1 )
{
sb.append(header.getValue());
}
else
{
StringBuffer concat = new StringBuffer();
i = 0;
while ( i < values.length )
{
if ( i != 0 )
concat.append(",");
concat.append(values[i]);
i++;
}
sb.append(concat.toString());
}
System.out.println(sb.toString());
}
// save message to file
File outputfile = new File("./test/swa.xml");
FileOutputStream fos = new FileOutputStream(outputfile);
message.writeTo(fos);
fos.flush();
fos.close();
System.out.println("Message saved to: "+outputfile);
// reload message from saved file
FileInputStream fis = new FileInputStream(outputfile);
messagefactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
SOAPMessage soapmessage = messagefactory.createMessage(mimeheaders1,fis);
System.out.println("\nReloaded message: "+soapmessage);
// MimeHeaders from reloaded message
MimeHeaders soapmimeheaders = soapmessage.getMimeHeaders();
it = soapmimeheaders.getAllHeaders();
j = 0;
System.out.println("MimeHeaders of reloaded message:");
while ( it.hasNext() )
{
MimeHeader header = (MimeHeader)it.next();
String[] values = soapmimeheaders.getHeader(header.getName());
//
sb.setLength(0);
sb.append("\t ");
sb.append("[");
sb.append(j);
sb.append("](length=");
sb.append(values.length);
sb.append(") ");
sb.append(header.getName());
sb.append(" = ");
j++;
//
if ( values.length == 1 )
{
sb.append(header.getValue());
}
else
{
StringBuffer concat = new StringBuffer();
i = 0;
while ( i < values.length )
{
if ( i != 0 )
concat.append(",");
concat.append(values[i]);
i++;
}
//
sb.append(concat.toString());
}
System.out.println(sb.toString());
}
// attachments from reloaded message
count = soapmessage.countAttachments();
System.out.println("\nCount of attachments in reloaded message: "+count);
it = soapmessage.getAttachments();
j = 1;
while ( it.hasNext() )
{
AttachmentPart ap = (AttachmentPart)it.next();
javax.activation.DataHandler dh = ap.getDataHandler();
sb.setLength(0);
sb.append("\t");
sb.append(j);
sb.append("/");
sb.append(count);
sb.append(": ContentId=");
sb.append(ap.getContentId());
sb.append(" ContentType=");
sb.append(ap.getContentType());
sb.append(" ContentLocation=");
sb.append(ap.getContentLocation());
sb.append(" Size=");
sb.append(ap.getSize());
sb.append(" DataHandler="+dh.getClass().getName());
sb.append(",");
sb.append(ap.getClass().getName());
j++;
System.out.println(sb.toString());
}
// recreate attachment files
it = soapmessage.getAttachments();
j = 1;
System.out.println("\nRestoring attachments fom reloaded message:");
byte[] buffer = new byte[32*1024*1024];
int bytesread = 0;
while ( it.hasNext() )
{
AttachmentPart ap = (AttachmentPart)it.next();
javax.activation.DataHandler dh = ap.getDataHandler();
sb.setLength(0);
sb.append("\t");
sb.append(j);
sb.append("/");
sb.append(count);
sb.append(": ContentId=");
sb.append(ap.getContentId());
sb.append(" ContentType=");
sb.append(ap.getContentType());
//sb.append(" Size=");
//sb.append(ap.getSize());
File f = new File("./test/swa_"+ap.getContentId());
OutputStream os = new FileOutputStream(f);
InputStream is = dh.getInputStream();
while ( (bytesread=is.read(buffer)) != -1 )
{
os.write(buffer,0,bytesread);
}
os.flush();
os.close();
sb.append(" saved to: ");
sb.append(f);
sb.append(" length=");
sb.append(f.length());
j++;
System.out.println(sb.toString());
}
fis.close();
}
catch ( Throwable t )
{
t.printStackTrace();
}