You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Grégoire Rolland <GR...@husson-info.fr> on 2007/08/23 10:42:02 UTC

MTOM + Rampart produce OutOfMemoryError

Hi,

I have a file download Service, this is the code :

public abstract class Updater implements IUpdater
{
	private static final String FILE_ELEMENT_NAME = "file";

	private static final String OM_NAMESPACE_NAME = "update";

	private static final String OM_NAMESPACE = "http://updater.webservices.hussoninfo.fr";

	private String directory;

	private String fileName;

	public void setFileName(final String in_fileName) {
		fileName = in_fileName;
	}

	protected abstract String getRootPath();

	private String getUpdatePath() {
		return getRootPath() + File.separator + directory;
	}

	public OMElement getFile(final OMElement in_e)
	{
		OMFactory factory = OMAbstractFactory.getOMFactory();
		OMNamespace ns = factory.createOMNamespace(OM_NAMESPACE, OM_NAMESPACE_NAME);
		OMElement fileElement = OMAbstractFactory.getOMFactory().createOMElement(FILE_ELEMENT_NAME, ns);
            DataHandler dataHandler = new DataHandler(new FileDataSource(getUpdatePath() + File.separator + fileName));
            OMText textData = factory.createOMText(dataHandler, true);
            fileElement.addChild(textData);
		return fileElement;
	}
}

This is the service.xml (see service DatabaseUptader)

<serviceGroup>
	
	<service name="InitService" class="fr.hussoninfo.webservices.lifecycle.InitService">
	    <description>Service d'initialisation</description>
	    <parameter name="ServiceClass">fr.hussoninfo.webservices.lifecycle.InitService</parameter>
	    <parameter name="ServiceTCCL">composite</parameter>
	    <parameter name="load-on-startup">true</parameter>
  	</service>
	
	<service name="DatabaseUpdater">
		<description>Service de mise a jour de base de donnees</description>
		<messageReceivers>
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
		</messageReceivers>
		<parameter name="ServiceClass" locked="false">fr.hussoninfo.webservices.updater.IUpdater</parameter>
		<parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
    		<parameter name="SpringBeanName">databaseUpdater</parameter>
    		<parameter name="enableMTOM" locked="false">true</parameter>
    	
		<module ref="rampart" /> 

		<operation name="getFile">
        		<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
        		<actionMapping>urn:getFile</actionMapping>
    		</operation>

		<wsp:Policy wsu:Id="UTOverTransport"
			xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
			xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">

			<wsp:ExactlyOne>
				<wsp:All>
					<sp:TransportBinding
						xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
						<wsp:Policy>
							<sp:TransportToken>
								<wsp:Policy>
									<sp:HttpsToken
										RequireClientCertificate="false" />
								</wsp:Policy>
							</sp:TransportToken>
							<sp:AlgorithmSuite>
								<wsp:Policy>
									<sp:Basic256 />
								</wsp:Policy>
							</sp:AlgorithmSuite>
							<sp:Layout>
								<wsp:Policy>
									<sp:Lax />
								</wsp:Policy>
							</sp:Layout>
						</wsp:Policy>
					</sp:TransportBinding>
					<sp:SignedSupportingTokens
						xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
						<wsp:Policy>
							<sp:UsernameToken
								sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient" />
						</wsp:Policy>
					</sp:SignedSupportingTokens>

					<ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">
						<ramp:passwordCallbackClass>fr.hussoninfo.webservices.security.PasswordCallback</ramp:passwordCallbackClass>
					</ramp:RampartConfig>
					
				</wsp:All>
			</wsp:ExactlyOne>
		</wsp:Policy>
	</service>
</serviceGroup>


And here the client : 


public abstract class AbstractUpdaterClient {

	private static final String URN_GET_FILE = "urn:getFile";
	private static final String METHOD_GET_FILE = "getFile";
	private static final String WEBSERVICES_NAMESPACE = "http://updater.webservices.hussoninfo.fr";
	private static final String RAMPART_MODULE_NAME = "rampart";

	private String domaine = null;

	private ConfigurationContext cc = null;

	private Policy policy = null;

	public AbstractUpdaterClient(final ConfigurationContext in_cc, final Policy in_policy, final String in_domaine)
	{
		domaine = in_domaine;
		cc = in_cc;
		policy = in_policy;
	}

	protected abstract String getUpdateService();
	
	private String getEPRString()
	{
		return "http://" + domaine + "/TCXUpdater/services/" + getUpdateService();
	}

	public void retrieveFile(final String in_outputFile) throws IOException
	{
	   ServiceClient serviceClient2 = new ServiceClient(cc, null);
		
        EndpointReference targetEPR2 = new EndpointReference(getEPRString());

        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace(WEBSERVICES_NAMESPACE, METHOD_GET_FILE);
        
        OMElement method = fac.createOMElement(METHOD_GET_FILE, omNs);

        serviceClient2.engageModule(RAMPART_MODULE_NAME);
        
        Options options2 = serviceClient2.getOptions();
        options2.setTo(targetEPR2);
        options2.setAction(URN_GET_FILE);
        options2.setProperty(RampartMessageData.KEY_RAMPART_POLICY,  policy);
        options2.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);

        MessageContext messageContext = new MessageContext();
        messageContext.setServiceContext(serviceClient2.getServiceContext());
        SOAPFactory soapFactory = OMAbstractFactory.getSOAP12Factory();
        SOAPEnvelope envelope = soapFactory.getDefaultEnvelope();
        envelope.getBody().addChild(method);
        serviceClient2.addHeadersToEnvelope(envelope);
        messageContext.setEnvelope(envelope);
        OperationClient operationClient = serviceClient2.createClient(ServiceClient.ANON_OUT_IN_OP);
        operationClient.addMessageContext(messageContext);
        operationClient.execute(true);
        MessageContext responseMc = operationClient
                .getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);

        DataHandler attachement = responseMc.getAttachment(
        		responseMc.getAttachmentMap().getAllContentIDs()[1]);
        
        InputStream is = new BufferedInputStream(attachement.getDataSource().getInputStream());
        OutputStream os = new BufferedOutputStream(new FileOutputStream(in_outputFile));
        
        IOUtils.copy(is, os);
        
        os.close();
        is.close();
        
        os = null;
        is = null;
	}
}

MTOM caching is enabled on client side (axis2.xml fragment):

<parameter name="cacheAttachments" locked="false">true</parameter>
<parameter name="attachmentDIR" locked="false">c:/tcx/cache</parameter>
<parameter name="sizeThreshold" locked="false">1024</parameter>

Policy for client side :

<wsp:Policy wsu:Id="UTOverTransport"
	xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
	xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
	<wsp:ExactlyOne>
		<wsp:All>
			<sp:TransportBinding
				xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
				<wsp:Policy>
					<sp:TransportToken>
						<wsp:Policy>
							<sp:HttpsToken
								RequireClientCertificate="false" />
						</wsp:Policy>
					</sp:TransportToken>
					<sp:AlgorithmSuite>
						<wsp:Policy>
							<sp:Basic256 />
						</wsp:Policy>
					</sp:AlgorithmSuite>
					<sp:Layout>
						<wsp:Policy>
							<sp:Lax />
						</wsp:Policy>
					</sp:Layout>
				</wsp:Policy>
			</sp:TransportBinding>
			<sp:SignedSupportingTokens
				xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
				<wsp:Policy>
					<sp:UsernameToken
						sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient" />
				</wsp:Policy>
			</sp:SignedSupportingTokens>
		</wsp:All>
	</wsp:ExactlyOne>
</wsp:Policy>

And the method to get the Policy :

StAXOMBuilder builder = new StAXOMBuilder(CONF_POLICY_XML);
policy =  PolicyEngine.getPolicy(builder.getDocumentElement());
        
RampartConfig rc = new RampartConfig();
rc.setUser("user");
rc.setPwCbClass(PasswordCallback.class.getName());
policy.addAssertion(rc);


And now the problem :

It works with file not larger than 10mb, without tuning JVM memory.
When I disengage Rampart module (both client and server), all works fine with larger file !! But when Rampart is engaged I get an OutOfMemoryError on the client side for file larger than 10mb.

For a file of 74MB, I have to set client JVM Memory to 728MB !!! 

My conf :
Axis2 1.2, Rampart 1.2, Tomcat/5.5, jsdk_1.5_10

Thanks for your response, 


Grégoire Rolland


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-help@ws.apache.org