Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javax Transformer在多线程服务中为空_Java_Spring_Spring Boot_Xslt_Javabeans - Fatal编程技术网

Javax Transformer在多线程服务中为空

Javax Transformer在多线程服务中为空,java,spring,spring-boot,xslt,javabeans,Java,Spring,Spring Boot,Xslt,Javabeans,我使用Javax Transformer类使用XSLT转换XML。负载减少时,一切正常。但当负载到来时,事情开始破裂。基本上,transformer表现出奇怪的行为,并被设置为null,从而引发异常 代码 但transformer仍然是空的 PS:这个方法被多个线程高度调用,因此我在函数中使用transformer作为局部变量 有人能提供一个解决办法吗 编辑: @Bean TransformerFactory transformerFactory() { return

我使用Javax Transformer类使用XSLT转换XML。负载减少时,一切正常。但当负载到来时,事情开始破裂。基本上,transformer表现出奇怪的行为,并被设置为null,从而引发异常

代码

但transformer仍然是空的

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

有人能提供一个解决办法吗

编辑:

@Bean 
    TransformerFactory transformerFactory() {
        return TransformerFactory.newInstance();
    }

@服务
公共类XmlProcessorUtil{
私有静态最终对象池池=新的GenericObject池(新的XPathPoolFactory());
public static final org.slf4j.Logger Logger=LoggerFactory.getLogger(XmlProcessorUtil.class);
@自动连线
变压器厂变压器厂;
公共字符串transformXmlUsingXsltWithParams(字符串xsltPath、文档xml、HashMap参数){
Source xslt=newstreamsource(新文件(xsltPath));
Source xmlSource=新的DOMSource(xml);
返回TransformXmlUsingXltWithParams(xslt、xmlSource、params);
}
公共字符串转换XMLUsingXSLTwithParams(源xslt、源xml、HashMap参数)
{
字符串结果=”;
StringWriter编写器=新的StringWriter();
if(xslt==null)
返回null;
变压器=零;
尝试
{
transformer=transformerFactory.newTemplates(xslt).newTransformer();
}
捕获(例外e)
{
记录器警告(“变压器设置错误”,e);
返回null;
}
if(params!=null&&!params.isEmpty())
{
for(字符串键:params.keySet())
{
if(transformer!=null)
transformer.setParameter(key,params.get(key));
}
}
尝试
{
if(transformer==null){
info(“Transformer为null!!”;
}
if(xml==null){
info(“XML为null!!”;
}
transform(xml,新的StreamResult(writer));
}
捕获(转换异常e)
{
e、 printStackTrace();
返回null;
}
结果=writer.toString();
返回结果;
}
}

现在还不完全清楚这里发生了什么,但是在多线程环境中使用JAXP看起来完全错误


您应该尝试为整个应用程序创建一个
TransformerFactory
实例。您应该为每个样式表创建一个
模板
对象,如果同一样式表用于多个转换,则缓存该对象。您应该为每个转换创建一个
转换器
(使用
模板.newTransformer()
),注意
转换器只能在单个线程中使用。

可以这样设置转换器
Transformer=TransformerFactory.newInstance().newTemplates(xslt).newTransformer()做一个变通调试。根据tje java文档,理论上,这不可能作为新变压器。不应返回
null
.M。正如我所说,Deinum在我们的生产环境中时断时续地出现;它在正常加载调试期间工作正常。编写一个复制行为的测试用例(启动大量线程,直到它开始失败)。甚至可能是内部某些东西链接很弱,并且由于垃圾/内存的数量,它会被清除。如果不能复制它,它将是在黑暗中拍摄的。您的代码没有显示任何继承缺陷,应该在多线程环境中“正常工作”。您已抑制了transformer创建的异常,相反,如果存在异常,您将返回null,是否确定没有异常我已使用建议的代码编辑了问题。你能检查一下吗?现在看起来好多了,但我只是匆匆看了一眼。它有用吗?
transformer = TransformerFactory.newInstance().newTransformer(xslt);

@Bean 
    TransformerFactory transformerFactory() {
        return TransformerFactory.newInstance();
    }

@Service
public class XmlProcessorUtil {

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

    public static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(XmlProcessorUtil.class);

    @Autowired
    TransformerFactory transformerFactory ;

    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, HashMap<String, String> params)
    {
        String result = "";
        StringWriter writer = new StringWriter();

        if(xslt == null)
            return null;

        Transformer transformer = null;

        try
        {
            transformer = transformerFactory.newTemplates(xslt).newTransformer();
        }
        catch (Exception e)
        {
            LOGGER.warn("Error in setting transformer",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;
    }
}