Javax Transformer在多线程服务中为null

我正在使用Javax Transformer类使用xslts转换xml。负载较小时,一切正常。但是,当负载来临时,事情开始破裂。基本上,transformer表现出奇怪的行为,并将其设置为null从而引发异常。

代码

height 100%

在日志中搜索时,有很多“ Transformer为空!”的实例。 。此外,错误是间歇性的。该类是一个bean,用于转换的方法(transformXmlUsingXsltWithParams)是一个明显的实例方法。 毫无例外 设置

app-foo{
  flex: 1;
  display: flex;
}

,但是变压器仍然为空。

PS:该方法被多个线程高度调用,因此我在函数中使用了转换器作为局部变量

有人可以提供解决方法吗?

编辑:

@Service
public class XmlProcessorUtil {

    private static final ObjectPool<XPath> pool = new GenericObjectPool<XPath>(new 
      XPathPoolFactory());

    public  String transformXmlUsingXsltWithParams(String xsltPath,Document xml,HashMap<String,String> params) {
        Source xslt = new StreamSource(new File(xsltPath));
        Source xmlSource = new DOMSource(xml);
        return transformXmlUsingXsltWithParams(xslt,xmlSource,params);
    }

    public  String transformXmlUsingXsltWithParams(Source xslt,Source xml,String> params)
    {
        String result = "";
        StringWriter writer = new StringWriter();

        if(xslt == null)
            return null;

        Transformer transformer = null;

        try
        {
            transformer = TransformerFactory.newInstance().newTransformer(xslt);
        }
        catch (Exception e)
        {

            return null;
        }

        if(params != null && !params.isEmpty())
        {
            for(String key : params.keySet())
            {
                if(transformer != null)
                    transformer.setParameter(key,params.get(key));
            }
        }
        try
        {
            if(transformer==null) {
                LOGGER.info("Transformer is null!!");
            }
            if(xml==null) {
                LOGGER.info("XML  is null!!");
            }
            transformer.transform(xml,new StreamResult(writer));
        }
        catch (TransformerException e)
        {
            e.printStackTrace();
            return null;
        }
        result = writer.toString();
        return result;
    }
}
transformer = TransformerFactory.newInstance().newTransformer(xslt);

lovejason200 回答:Javax Transformer在多线程服务中为null

目前还不清楚,这是怎么回事,但是在多线程环境中使用JAXP看起来是完全错误的。

您应该尝试为整个应用程序创建一个TransformerFactory实例。您应该为每个样式表创建一个Templates对象,如果同一样式表将用于多个转换,请缓存该对象。而且,您应该为每个转换创建一个Transformer(使用Templates.newTransformer()),注意Transformer仅可在单个线程中使用。

本文链接:https://www.f2er.com/3161776.html

大家都在问