0

Web サービスで開いているファイルが多すぎるというエラーが発生していたので、閉じる必要があるものが他にないことを確認したかっただけです。close()on outWriter( )を追加しましたStringWriterが、JavaDoc によると、これは効果がありません。getCachedExtractSoapBodyXslt()オブジェクトを取得しjavax.xml.transform.Transformerます。

String payload;
StreamResult result=null;
StringWriter outWriter=null;
try {
    // Programmatically extract the SOAP Body from message
    outWriter = new StringWriter();
    result = new StreamResult(outWriter);
    Source src = new StreamSource(new java.io.StringReader(doc));
    getCachedExtractSoapBodyXslt().transform(src, result);
    StringBuffer sb = outWriter.getBuffer();
    payload = sb.toString();
} catch (TransformerException e) {
    throw new ComponentException("Unable to extract SOAP Body");
}
finally {
    LOG.debug("Closing XSLT transformer output stream");
    try {
        outWriter.close();
    }
    catch (IOException e) {
        LOG.error("Failed to close stream for SOAP message");
    }
}
4

2 に答える 2

2

これを独自の変数に移動して閉じる必要がありました

new java.io.StringReader(doc)
于 2014-07-23T13:44:59.047 に答える
0

StreamSource にはクローズがなく、そのユーザーが保持しているストリームまたはリーダーを閉じていないことがわかりました。また、「クローズ可能」ではないため、try-with-resource もオプションではありません。そのため、古い学校に行き、getInputStream および GetReader メソッドを呼び出す try/finally を使用し、その結果を IOUtils.closeQuietly に渡す必要がありました。

StreamSource source = null;
try {
   source = new StreamSource(inputStream);
   // Do stuff with source
}
finally {
   IOUtils.closeQuietly(source.getInputStream());
}

私の場合、ソースは 2 つの異なる方法で構築されていたため、実際には getInputStream と getReader の両方を呼び出す必要がありました。

于 2016-12-01T22:57:30.883 に答える