Dear all, I'm trying to get a webservice up an running that is capable of receiving large documents, so I decided to give MTOM/XOP a try. Although I seem to have done everything necessary, I still get OutOfMemoryExceptions on both, client and server side. Here is what I've done so far: The service:
| @WebService | @BindingType(value = SOAPBinding.SOAP11HTTP_MTOM_BINDING) | @MTOM(enabled = true) | @Stateless | public class SampleService { | | public void sendDocument(@XmlMimeType(value = "application/octet-stream") DataHandler document) { | | if (document != null) { | try { | InputStream in = document.getInputStream(); | File f = File.createTempFile("mtom", ".dat", new File("/tmp")); | if (f.exists() && f.canWrite()) { | FileOutputStream fout = new FileOutputStream(f); | byte[] buffer = new byte[4096]; | int rLines = -1; | while ((rLines = in.read(buffer)) > 0) { | fout.write(buffer, 0, rLines); | } | fout.close(); | in.close(); | } | } catch (Exception e) { | e.printStackTrace(); | } | } | } | | } | Deploys fine. After doing wsconsume on the WSDL I end up with this client: | public class TestClient { | | public static void main(String[] args) { | | if (args.length != 1) { | System.err.println("usage: java -jar TestMTOM-client.jar <fileToSend>"); | return; | } | | File fin = new File(args[0]); | if (!fin.exists()) { | System.err.println("No such file: "+args[0]); | return; | } | | SampleServiceService service = new SampleServiceService(); | SampleService port = service.getSampleServicePort(); | SOAPBinding binding = (SOAPBinding)((BindingProvider)port).getBinding(); | binding.setMTOMEnabled(true); | | DataHandler handler = new DataHandler(new FileDataSource(fin)); | port.sendDocument(handler); | } | } | Logfile and final exception with DEBUG set on org.jboss and org.jboss.management after the client was invoked with a 100MB file (and using -Xmx512m to prevent OOME on client-side): anonymous wrote : | 13:05:45,032 DEBUG [DefaultSPIProvider] provide SPI 'class org.jboss.wsf.spi.management.EndpointRegistryFactory' | 13:05:45,033 DEBUG [DefaultSPIProvider] class org.jboss.wsf.spi.management.EndpointRegistryFactory Implementation: org.jboss.wsf.stack.jbws.endpointregistryfactoryi...@4d4f6e | 13:05:45,049 DEBUG [RequestHandlerImpl] doPost: /TestMTOM/SampleService | 13:05:45,050 DEBUG [RequestHandlerImpl] handleRequest: jboss.ws:context=TestMTOM,endpoint=SampleService | 13:05:45,070 DEBUG [MessageContextAssociation] pushMessageContext: org.jboss.ws.core.jaxws.handler.soapmessagecontextja...@104f889 (Thread http-127.0.0.1-8080-1) | 13:05:45,080 DEBUG [RequestHandlerImpl] BEGIN handleRequest: jboss.ws:context=TestMTOM,endpoint=SampleService | 13:05:45,130 DEBUG [MessageFactoryImpl] createMessage: [contentType=multipart/related; | start="<rootpart*16c428f3-1021-43de-af64-aecc25b7f...@example.jaxws.sun.com>"; | type="application/xop+xml"; | boundary="uuid:16c428f3-1021-43de-af64-aecc25b7fe93"; | start-info="text/xml"] | 13:05:45,740 DEBUG [DefaultSPIProvider] provide SPI 'class org.jboss.wsf.spi.management.ServerConfigFactory' | 13:05:45,748 DEBUG [DefaultSPIProvider] class org.jboss.wsf.spi.management.ServerConfigFactory Implementation: org.jboss.wsf.framework.management.serverconfigfactoryi...@8fc809 | 13:05:53,229 DEBUG [SwapableMemoryDataSource] Using swap file, location = file:/usr/home/kazcor/Apps/jboss-4.2.3.GA/server/default/tmp/jbossws/JBossWSattachment52750.dat size = 139810362 | 13:05:58,690 DEBUG [HandlerDelegateJAXWS] callRequestHandlerChain: POST | 13:05:58,697 DEBUG [HandlerResolverImpl] initHandlerChain: PRE | 13:05:58,777 DEBUG [HandlerResolverImpl] addHandler: | HandlerMetaDataJAXWS: | type=PRE | name=Recording Handler | class=class org.jboss.wsf.framework.invocation.RecordingServerHandler | params=[] | protocols=##SOAP11_HTTP | services=null | ports=null | 13:05:58,786 DEBUG [HandlerResolverImpl] initHandlerChain: ENDPOINT | 13:05:58,794 DEBUG [HandlerResolverImpl] initHandlerChain: POST | 13:05:58,808 DEBUG [HandlerResolverImpl] getHandlerChain: [type=POST,info=[service={http://mtom.test.openlimit.com/}SampleServiceService,port={http://mtom.test.openlimit.com/}SampleServicePort,binding=http://schemas.xmlsoap.org/wsdl/soap/http?mtom=true]] | 13:05:58,816 DEBUG [HandlerChainExecutor] Create a handler executor: [] | 13:05:58,826 DEBUG [SOAPMessageDispatcher] getDispatchDestination: {http://mtom.test.openlimit.com/}sendDocument | 13:05:58,834 DEBUG [SOAP11BindingJAXWS] unbindRequestMessage: {http://mtom.test.openlimit.com/}sendDocument | 13:05:58,846 DEBUG [EndpointInvocation] setRequestParamValue: [name={http://mtom.test.openlimit.com/}sendDocument,value=org.jboss.ws.core.soap.SOAPBodyElementDoc] | 13:05:58,861 DEBUG [HandlerDelegateJAXWS] callRequestHandlerChain: ENDPOINT | 13:05:58,868 DEBUG [HandlerResolverImpl] getHandlerChain: [type=ENDPOINT,info=[service={http://mtom.test.openlimit.com/}SampleServiceService,port={http://mtom.test.openlimit.com/}SampleServicePort,binding=http://schemas.xmlsoap.org/wsdl/soap/http?mtom=true]] | 13:05:58,876 DEBUG [HandlerChainExecutor] Create a handler executor: [] | 13:05:58,883 DEBUG [HandlerDelegateJAXWS] callRequestHandlerChain: PRE | 13:05:58,890 DEBUG [HandlerResolverImpl] getHandlerChain: [type=PRE,info=[service={http://mtom.test.openlimit.com/}SampleServiceService,port={http://mtom.test.openlimit.com/}SampleServicePort,binding=http://schemas.xmlsoap.org/wsdl/soap/http?mtom=true]] | 13:05:58,897 DEBUG [HandlerChainExecutor] Create a handler executor: [] | 13:05:58,907 DEBUG [EndpointInvocation] getRequestPayload | 13:05:58,914 DEBUG [EndpointInvocation] getRequestParamValue: {http://mtom.test.openlimit.com/}sendDocument | 13:05:58,922 DEBUG [SOAPContentElement] ----------------------------------- | 13:05:58,929 DEBUG [SOAPContentElement] Transitioning from XML_VALID to OBJECT_VALID | 13:05:58,936 DEBUG [XMLContent] getObjectValue [xmlType={http://mtom.test.openlimit.com/}sendDocument,javaType=class com.openlimit.test.mtom.jaxws.SendDocument] | 13:05:58,949 DEBUG [JAXBDeserializer] deserialize: [xmlName={http://mtom.test.openlimit.com/}sendDocument,xmlType={http://mtom.test.openlimit.com/}sendDocument] | 13:06:03,792 DEBUG [HandlerDelegateJAXWS] closeHandlerChain | 13:06:03,800 DEBUG [HandlerChainExecutor] close | 13:06:03,807 DEBUG [HandlerDelegateJAXWS] closeHandlerChain | 13:06:03,814 DEBUG [HandlerChainExecutor] close | 13:06:03,821 DEBUG [HandlerDelegateJAXWS] closeHandlerChain | 13:06:03,829 DEBUG [HandlerChainExecutor] close | 13:06:03,836 DEBUG [RequestHandlerImpl] END handleRequest: jboss.ws:context=TestMTOM,endpoint=SampleService | 13:06:03,844 DEBUG [MessageContextAssociation] popMessageContext: org.jboss.ws.core.jaxws.handler.soapmessagecontextja...@104f889 (Thread http-127.0.0.1-8080-1) | 13:06:04,179 ERROR [[SampleService]] Servlet.service() for servlet SampleService threw exception | java.lang.OutOfMemoryError: Java heap space | Seems to me like it is indeed transferred using XOP and that a swapfile is generated for the incoming request. However, afterwards on deserialization something goes wrong - I hope the former swapped attachment doesn't get deserialized in memory at this point? Tested with: JBoss 4.2.3GA (default settings -Xms128m -Xmx512m) JDK 1.5.0_14-p8 JBossWS (native) 3.1.1GA Any ideas what I've missed? Thanks in advance, Max View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4230012#4230012 Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4230012 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user