Author: veithen
Date: Sat Nov  8 13:55:57 2008
New Revision: 712437

URL: http://svn.apache.org/viewvc?rev=712437&view=rev
Log:
Optimized JMS sender to reduce the number of transformations (between 
ByteArrayOutputStream, byte[] and String) applied to the payload.

Modified:
    
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java

Modified: 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java?rev=712437&r1=712436&r2=712437&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
 (original)
+++ 
webservices/commons/trunk/modules/transport/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSSender.java
 Sat Nov  8 13:55:57 2008
@@ -27,6 +27,7 @@
 import org.apache.axis2.transport.MessageFormatter;
 import org.apache.axis2.transport.OutTransportInfo;
 import org.apache.axis2.transport.base.*;
+import org.apache.axis2.transport.base.streams.WriterOutputStream;
 import org.apache.axis2.transport.http.HTTPConstants;
 import org.apache.commons.logging.LogFactory;
 
@@ -34,9 +35,10 @@
 import javax.jms.Queue;
 import javax.activation.DataHandler;
 import javax.naming.Context;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.nio.charset.UnsupportedCharsetException;
 import java.util.*;
 
 /**
@@ -363,27 +365,38 @@
             String contentType = messageFormatter.getContentType(
                 msgContext, format, msgContext.getSoapAction());
 
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            boolean useBytesMessage =
+                msgType != null && 
JMSConstants.JMS_BYTE_MESSAGE.equals(msgType) ||
+                    
contentType.indexOf(HTTPConstants.HEADER_ACCEPT_MULTIPART_RELATED) > -1;
+
+            OutputStream out;
+            StringWriter sw;
+            if (useBytesMessage) {
+                BytesMessage bytesMsg = session.createBytesMessage();
+                sw = null;
+                out = new BytesMessageOutputStream(bytesMsg);
+                message = bytesMsg;
+            } else {
+                sw = new StringWriter();
+                try {
+                    out = new WriterOutputStream(sw, 
format.getCharSetEncoding());
+                } catch (UnsupportedCharsetException ex) {
+                    handleException("Unsupported encoding " + 
format.getCharSetEncoding(), ex);
+                    return null;
+                }
+            }
+            
             try {
-                messageFormatter.writeTo(msgContext, format, baos, true);
-                baos.flush();
+                messageFormatter.writeTo(msgContext, format, out, true);
+                out.close();
             } catch (IOException e) {
                 handleException("IO Error while creating BytesMessage", e);
             }
 
-            if (msgType != null && 
JMSConstants.JMS_BYTE_MESSAGE.equals(msgType) ||
-                
contentType.indexOf(HTTPConstants.HEADER_ACCEPT_MULTIPART_RELATED) > -1) {
-                message = session.createBytesMessage();
-                BytesMessage bytesMsg = (BytesMessage) message;
-                bytesMsg.writeBytes(baos.toByteArray());
-            } else {
-                message = session.createTextMessage();  // default
-                TextMessage txtMsg = (TextMessage) message;
-                try {
-                    txtMsg.setText(new String(baos.toByteArray(), 
format.getCharSetEncoding()));
-                } catch (UnsupportedEncodingException ex) {
-                    handleException("Unsupported encoding " + 
format.getCharSetEncoding(), ex);
-                }
+            if (!useBytesMessage) {
+                TextMessage txtMsg = session.createTextMessage();
+                txtMsg.setText(sw.toString());
+                message = txtMsg;
             }
             message.setStringProperty(BaseConstants.CONTENT_TYPE, contentType);
 
@@ -396,14 +409,12 @@
             if (omNode != null && omNode instanceof OMText) {
                 Object dh = ((OMText) omNode).getDataHandler();
                 if (dh != null && dh instanceof DataHandler) {
-                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                     try {
-                        ((DataHandler) dh).writeTo(baos);
+                        ((DataHandler) dh).writeTo(new 
BytesMessageOutputStream(bytesMsg));
                     } catch (IOException e) {
                         handleException("Error serializing binary content of 
element : " +
                             BaseConstants.DEFAULT_BINARY_WRAPPER, e);
                     }
-                    bytesMsg.writeBytes(baos.toByteArray());
                 }
             }
 


Reply via email to