【问题标题】:JAX-WS MTOM streaming: server reads entire stream before sendingJAX-WS MTOM 流式传输:服务器在发送前读取整个流
【发布时间】:2013-03-25 15:50:39
【问题描述】:

我有一个执行 MTOM 流的 JAX-WS RI 服务器。从客户那里,一切都很好。服务器收到一个 StreamingDataHandler,发送 1 GB 时双方都没有使用太多内存。但是,在检索文件时,服务器会在发送之前读取整个内容。客户端没问题。我在两端都使用 DataHandler,所以这方面很好。我只是不希望服务器在开始发送之前从 InputStream 中读取所有数据。我在 impl 上有以下注释:

@MTOM
@StreamingAttachment(parseEagerly = false, memoryThreshold = 1L)
@WebService(...)

我试过parseEagerly truefalse。我将内存阈值设置得很低,因为我不关心小文件的小性能损失。

这是 JAX-WS RI 的错误吗?

【问题讨论】:

    标签: java streaming jax-ws mtom


    【解决方案1】:

    这就是我所做的。像魅力一样工作。

    界面(觉得这很像你所做的)

    @WebService
    @SOAPBinding(style = Style.RPC)
    public interface ResultsServer {    
        @WebMethod
        @XmlMimeType("application/octet-stream")
        public DataHandler getResultDataAsXML(@WebParam Integer raceId) throws Exception;
    }
    

    实施

    @MTOM
    @WebService(endpointInterface = "ca.sportstats.wtc.ResultsServer")
    @StreamingAttachment(parseEagerly=true, memoryThreshold=4000000L)
    public class ResultsServerImpl implements ResultsServer {
    
        @Override
        public DataHandler getResultDataAsXML(@WebParam Integer raceId) throws Exception {
            File xmlFile = new File("c:/tmp/xml/response.xml");
            //... write my xml file using an XMLStreamWriter
            return new DataHandler(new FileDataSource(xmlFile));
        }
    }
    

    测试

    public class Test {
        public static void main(String[] args) throws Exception {
    
           URL url = new URL("http://url/to/ipmlementation/ResultsServerImplService?wsdl");
           QName qname = new QName("http://test.test.com/", "ResultsServer");
    
           Service service = Service.create(url, qname);
           ResultsServerImpl resultServer = service.getPort(ResultsServerImpl.class);
    
           /************  test download  ***************/
           DataHandler handler = resultServer.getResultDataAsXML(4);
           StreamingDataHandler dh = (StreamingDataHandler) handler;
           File file = File.createTempFile("test-received.xml", "");
           dh.moveTo(file);
           dh.close();
    
        }
    }
    

    这对我来说可以流式传输(从服务器)一个大型 XML 文件,而无需将其全部读取到内存中。

    另请参阅

    【讨论】:

    • 我使用的是 weblogic 12c,与上面的实现相同。附件作为 base64 编码的字符串发送,而不是作为附件发送......这在 11g 上非常有效。您为此使用了什么环境?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2011-05-15
    • 2014-06-06
    相关资源
    最近更新 更多