2011-07-23 16 views
9

İstemcinin sunucuya XML gönderdiği ve bunu PDF oluşturduğu ve bunu istemciye gönderdiği bir sunucu-istemci mimarisine sahibim. sunucu tarafında aradaBir Soketin Giriş Aktarımının Unmarshallingi Soketi kapatır mı?

JAXBElement<Xml> xml = ... 
Socket sock = ... 
Marshaller marshaller = ... 
marshaller.marshal(xml, sock.getOutputStream()); 
sock.shutdownOuput();  

: istemci tarafında

ServerSocket server = ... 
Socket client = server.accept(); 
Unmarshaller unmarshaller = ... 
// client.isClosed() -> false 
JAXBElement<Xml> xml = 
    (JAXBElement<Xml>)) unmarshaller.unmarshall(client.getInputStream()); 
// client.isClosed() -> true 
Pdf pdf = new Pdf(xml); 
client.getOutputStream().write(pdf.toBytes()); 
// "socket is closed" IOException is thrown 

Ben unmarshall yoksa müşterinin InputStream (sunucu tarafında) ve sadece bir kukla geri göndermek PDF o zaman her şey yolunda gider. Yani, böylece örtülü olarak müşteri Socket günümü mahvediyor ... Bu çözmeye

konusunda fikrin kapatan Unmarshaller o verilen InputStream kapatır varsaymak zorundayız?

cevap

7

XMLEntityManager sınıfı, InputStream üzerinde kapanır.

Alttaki akışın kapat() çağrısını önlemek için FilterInputStream kullanabilirsiniz.

Alt sınıf FilterInputStream ve boş gövdeli close() yöntemini geçersiz:

public class MyInputStream extends FilterInputStream { 
    public MyInputStream(InputStream in) { 
    super(in); 
    } 

    @Override 
    public void close() { 
    // do nothing 
    } 
} 

Ardından (sizin unmarshall değiştirme) (Yani JAXB çerçeve hala yakın aramaları için

JAXBElement<Xml> xml = 
    (JAXBElement<Xml>)) unmarshaller.unmarshall(new MyInputStream(client.getInputStream())); 

diyoruz) üzerinde akış, ancak şimdi kendi akış örneğiniz tarafından filtreleniyor ve soket akışı açık kalıyor.

+0

teşekkür ederiz, senin çözüm cazibe gibi çalışır! :) –

6

vanje önermek gibi açıkça kodunuzda bir InputStream geçersiz kılmak istemiyorsanız, Apache commons-io bu modernleşmek bir uygulama sağlar:

bakmak:

CloseShieldInputStream

+0

Çok iyi bir çözüm –

İlgili konular