Я создаю веб-сервис SOAP. Я использую JAX-WS для создания этой службы и развертывания ее на сервере Glassfish 3.1.2.Потоковые пользовательские объекты
У меня нет проблем с тем, что эта служба возвращает строковое построение с представлением XML того, что я хочу. Я также могу получить его для возврата определенного объекта. У меня возникают проблемы с streaming этот ресурс.
Это то, что я до сих пор:
интерфейс:
@MTOM
@WebService
@XmlRootElement(name="root.element.class.location")
@SOAPBinding(style = Style.RPC, use=Use.LITERAL)
public interface ResultsServer {
@WebMethod
@XmlMimeType("text/xml")
public Test getResultDataAsXML(@WebParam(name="Id") Integer id) throws Exception;
}
Реализация:
---- Редактировать ----
Здесь я бы хотел мой ресурс. Предположим, мне нужен мой results
объект становится чрезвычайно большим, я не хочу держать его в памяти и хотел бы начать его отправку, не удерживая его. (Комментировал это в коде)
@WebService(endpointInterface = "my.endpoint.class")
@StreamingAttachment(parseEagerly=true, memoryThreshold=4000000L)
public class ResultsServerImpl implements ResultsServer {
@Override
public Test getResultDataAsXML(Integer id) throws Exception {
Test results = new Test();
for(int i=0; i<[very large number]; i++) {
results.getResults().add("here : " + i);
/**at one point, this is too large to hold in memory
I would like to be able to start returning the object here
so it is not taking up all available memory */
}
return results; //or close the stream
}
}
---- Конец ---- Редактирование
И мой Test
класс является простой класс вида:
public class Test {
private ArrayList<String> results;
public Test() {
results = new ArrayList<String>();
}
public ArrayList<String> getResults() {
return results;
}
public void setResults(ArrayList<String> results) {
this.results = results;
}
}
Давайте предположим, что этот объект Test
становится очень большим (и более сложным). Мне нужно иметь возможность передавать этот объект. Как бы я пошел, чтобы продолжить это.
В идеале, я хотел бы сохранить структуру этого объекта.
Из того, что я прочитал до сих пор, мне нужно было бы преобразовать этот объект в какой-то DataHandler
и вернуть этот объект.
Любая помощь приветствуется! Спасибо.
Реализация JAX-WS будет использовать реализацию JAXB маршалу объект (скорее всего к StAX 'XMLStreamWriter'), так что выход будет потоковом (там не быть XML документ, созданный в памяти). Вы ищете способ предотвратить возможность полной реализации экземпляра 'Test' в памяти? –
@BlaiseDoughan Я думаю, вы сформулировали это так, как я искал. Да, это будет предотвращать полное сохранение экземпляра 'Test' в памяти. Есть ли способ сделать это? Также: Спасибо за информацию, касающуюся маршалинга JAXB. Это ответило на многие вопросы, которые у меня были. – blo0p3r