我有一个执行 MTOM 流的 JAX-WS RI 服务器。从客户来说,一切都很好。服务器收到一个StreamingDataHandler,双方都没有使用太多内存发送1GB。但是,在检索文件时,服务器在发送之前会读取整个内容。客户端没问题。我在两端都使用 DataHandler,所以这方面的事情很好。我只是不希望服务器在开始发送之前从 InputStream 读取所有数据。我在 impl 上有以下注释:
@MTOM
@StreamingAttachment(parseEagerly = false, memoryThreshold = 1L)
@WebService(...)
我试过
parseEagerly
true
和 false
。我将内存阈值设置得很低,因为我不担心小文件的性能下降。这是 JAX-WS RI 的错误吗?
最佳答案
这就是我所做的。像魅力一样工作。
接口(interface) (认为它很像你所做的)
@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 文件有用,而无需在内存中读取它。
另见