Compression Handler
singular_droid Apr 1, 2005 8:30 AMHi! I'm trying to compress the response of my WS. This is the code of handler
import java.io.ByteArrayOutputStream; import java.net.URL; import java.util.zip.GZIPOutputStream; import javax.xml.namespace.QName; import javax.xml.rpc.handler.GenericHandler; import org.apache.axis.Message; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; public class CompressionHandler extends GenericHandler { static private Logger logger = Logger.getLogger(CompressionHandler.class); public QName[] getHeaders() { return new QName[0]; } public boolean handleResponse(org.apache.axis.MessageContext msgContext) { try { URL log4jConfig = CompressionHandler.class.getResource("log4j.xml"); DOMConfigurator.configure(log4jConfig); logger.info("Logger initialized"); ByteArrayOutputStream bos = new ByteArrayOutputStream(); GZIPOutputStream gz = new GZIPOutputStream(bos); Message msg = msgContext.getResponseMessage(); logger.info("length:"+msg.getContentLength()); gz.write(msg.getSOAPPartAsBytes()); gz.close(); bos.close(); Message msg2 = new Message(bos.toByteArray()); msgContext.setResponseMessage(msg2); } catch (Exception e) { e.printStackTrace(); } return true; } public boolean handleRequest(org.apache.axis.MessageContext msgContext) { try { URL log4jConfig = CompressionHandler.class.getResource("log4j.xml"); DOMConfigurator.configure(log4jConfig); logger.info("Logger initialized"); ByteArrayOutputStream bos = new ByteArrayOutputStream(); GZIPOutputStream gz = new GZIPOutputStream(bos); Message msg = msgContext.getRequestMessage(); logger.info("length:"+msg.getContentLength()); gz.write(msg.getSOAPPartAsBytes()); gz.close(); bos.close(); Message msg2 = new Message(bos.toByteArray()); msgContext.setRequestMessage(msg2); } catch (Exception e) { e.printStackTrace(); } return true; } public CompressionHandler() { } }
This is the part of my webservices.xml:
<webservice-description> <webservice-description-name>HelloBeanService</webservice-description-name> <wsdl-file>META-INF/wsdl/hello.wsdl</wsdl-file> <jaxrpc-mapping-file>META-INF/mapping.xml</jaxrpc-mapping-file> <port-component> <port-component-name>HelloBean</port-component-name> <wsdl-port>HelloBeanEndpoint</wsdl-port> <service-endpoint-interface> ru.zenith.interfaces.HelloBeanEndpoint </service-endpoint-interface> <service-impl-bean> <ejb-link>HelloBean</ejb-link> </service-impl-bean> <handler> <handler-name>CompressionHandler</handler-name> <handler-class>ru.zenith.handlers.CompressionHandler</handler-class> </handler> </port-component> </webservice-description>
After deployment I've found this in server.log:
2005-04-01 17:01:33,984 DEBUG [org.jboss.webservice.server.InvokerProvider] Adding server side handler to service 'HelloBeanService': [class=ru.zenith.handlers.CompressionHandler,headers=[],config={}] ... 2005-04-01 17:01:34,015 DEBUG [org.jboss.webservice.handler.HandlerChainBaseImpl] Handle request: [state=METHOD_READY,handler=ru.zenith.handlers.CompressionHandler@b94bd7] 2005-04-01 17:01:34,015 DEBUG [org.jboss.webservice.handler.HandlerChainBaseImpl] Exit: doHandleRequest with status: true
But the outgoing SOAP message is still uncompressed.