Burada listelenen ve sizi yönlendiren cevaplar SOAPHandler
tamamen doğrudur. Bu yaklaşımın yararı, SOAPHandler JAX-WS spesifikasyonunun bir parçası olduğu için herhangi bir JAX-WS uygulamasıyla çalışacak olmasıdır. Ancak, SOAPHandler ile ilgili sorun, dolaylı olarak tüm XML iletisini bellekte göstermeye çalışmasıdır. Bu, büyük bellek kullanımına yol açabilir. JAX-WS'nin çeşitli uygulamaları bunun için kendi geçici çözümlerini ekledi. Büyük talepler veya büyük yanıtlarla çalışıyorsanız, özel yaklaşımlardan birine bakmanız gerekir.
"JDK 1.5 veya daha iyisine dahil olan" hakkında soru sorduğunuzdan, resmi olarak JDK'da bulunan JAX-WS RI (aka Metro) olarak bilinen şeyle ilgili olarak cevap vereceğim.
JAX-WS RI bunun için bellek kullanımı açısından çok verimli olan özel bir çözüme sahiptir.
Bkz. Https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Maalesef bu bağlantı koptu ancak WayBack Machine'de bulabilirsiniz. Aşağıda vurgulayacağım:
2007'de Metro halkı, Metro'ya ait ek bir işleyici türü tanıttıMessageHandler<MessageHandlerContext>
. SOAPHandler<SOAPMessageContext>
Bellek içi DOM gösterimi yapmaya çalışmadığından çok daha verimlidir .
İşte orijinal blog makalesindeki önemli metin:
messageHandler:
JAX-WS Spesifikasyonu tarafından sağlanan genişletilebilir İşleyici çerçevesini ve RI'da daha iyi İleti soyutlamasını MessageHandler
kullanarak, Web Hizmeti uygulamalarınızı genişletmek için adlandırılan yeni bir işleyici tanıttık . MessageHandler, SOAPHandler uygulamasına benzer, ancak uygulamalarına erişilmesi dışındaMessageHandlerContext
(MessageContext'in bir uzantısı). MessageHandlerContext aracılığıyla Mesaj'a erişebilir ve Mesaj API'sını kullanarak işleyebilir. Blog başlığına koyduğum için, bu işleyici Mesaj üzerinde çalışmanıza izin verir, bu da sadece DOM tabanlı bir mesaja değil, mesaja erişmek / işlemek için etkili yollar sağlar. İşleyicilerin programlama modeli aynıdır ve Message işleyicileri standart Logical ve SOAP işleyicileri ile karıştırılabilir. JAX-WS RI 2.1.3'te iletileri günlüğe kaydetmek için MessageHandler kullanımını gösteren bir örnek ekledim ve işte örnekten bir snippet:
public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}
public void close(MessageContext messageContext) { }
public Set getHeaders() {
return null;
}
}
(2007 blog yazısından alıntı)
Söylemeye gerek yok, özel işleyicinizin LoggingHandler
herhangi bir etkisi olması için işleyici zincirinize eklenmesi gerekir. Bu, başkalarını eklemekle aynıdır Handler
, bu yüzden nasıl yapılacağı hakkında bu sayfadaki diğer cevaplara bakabilirsiniz .
Bir bulabilirsiniz tam bir örnek de Metro GitHub repo .