假期结束,开始收心回来继续工作。晚上有一个项目要发布,公司的同事突然打手机给我,说ASF的文件解析又出了上次的问题,希望尽快解决。
问题描述:
上一次问题:
多台机器运行同一个分支的应用,但是有些机器正常,有一台机器始终在启动的时候报文件解析错误,从提示看来,主要是因为解析配置文件的时候校验dtd失效,这台机器无法连接外网。最后降低了我们内部的核心解析包,问题解决(或者让这台机器连接到外网)。(当时由于自己手头工作比较多,也没有在意,既然解决了就随之过去了)
此次问题:
问题的提示和上次的类似,不过这次的机器时连接外网的。
问题查找:
解析出错的文件是ASF(SCA的服务框架)的组件配置文件(composite文件),格式为xml的格式,解析方式是通过StAX标准来实现的。
按照上一次的解决方法,我将内部的tuscany0.998降级到tuscany0.997,解析正常。看了一下我对于这两个版本升级作的修改,主要是支持了SCA框架中的Spring配置文件能够使用import的标签,内签多个标准的spring文件。
跟踪代码内部发现,果然是在解析某几个spring的配置文件时出现了问题,比较了一下ASF的Spring(正常解析)和标准的Spring配置文件,差别主要是在关于Xml的校验申明的区别。ASF的Spring配置文件是由ASF Spring插件来自己解析的(采用Schema申明(固定的Target namingspace),因此早先所有的ASF的Spring我都要求大家采用Schema的校验申明),而对于原来不是ASF的spring都是采用dtd的校验方式申明(互相拷贝导致都是这样)。下面就是两种申明:
Schema:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sca="http://www.springframework.org/schema/sca"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/sca http://www.springframework.org/schema/sca/spring-sca.xsd">
Dtd:
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
早先由于在0.997版本中没有支持import,因此也就不会去解析那些不是ASF的Spring文件,而现在因为需求支持了import所以需要解析那些原来不属于ASF的Spring的配置文件。因此降低版本不是解决问题的办法。
进一步跟进问题,发现是在解析Dtd的申明时候出现问题,抛出异常说连接超时。通过IE访问了一下dtd的地址,的却也是有问题,无法连接。看来是Spring的dtd的服务器出现了问题,导致了我们解析文件时候校验无法正常,最终无法正常启动。
问题解决:
这里先说一下最后解决的几个方案,后面会有一些详细的解释和说明。
1. 升级ASF的Spring插件包,去除对于Xml的格式校验。
XMLInputFactory xmlFactory = XMLInputFactory.newInstance();
//add by wenchu.cenwc cancel support dtd check
xmlFactory.setProperty(XMLInputFactory.SUPPORT_DTD, "false");
2. 将Dtd的校验申明修改成为Schema的校验申明。
3. 建立公司的Xml校验服务器,控制管理dtd或者schema,将所有的xml Schema或者dtd申明指向该服务器。
问题延伸开来的思考:
就问题的解决方案来看这个问题的一些值得注意和思考的地方。
方案1:
当前对于XML解析来说,各种框架都已经统一的实现了StAX的标准,同时在jdk6得rt.jar中都已经将StAX API作为基础框架API纳入其内。而通常情况下,如果不配置是否校验Xml,那么都将默认会主动校验Xml,此时就会出现上面我所遇到的问题,如果当你依赖的Xml DTD 或者 Schema服务器出现问题,就会导致你本地应用可能受到影响。在Dtd的申明说明中,<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference">红色部分说可以在网络出现问题或者网络速度很慢的时候被部分xml解析器替代URIreference使用,不过我这边没有成功过。我通过自己屏蔽网络连接来模拟环境的情况,都是无法通过的。(Schema比较奇怪,就算无法连接网络还是可以正常的,这个后续需要继续研究看看,或者有朋友对这个问题有了解请告知一下)
方案2:
其实早在2002年就已经有将dtd替换成为schema的趋势了,两者的区别和优劣网上的文章介绍了很多了,这儿不再罗列,其实最更本一点就是schema就是用xml来校验xml,而dtd却采用了另一套规则来校验xml,其本身也是xml,扩展性,可读性,学习曲线等等都次与schema。除了遗留系统,我个人看不出还有什么必要去使用老的dtd来校验xml的格式。Spring的dtd服务的出现问题,也说明了其实对于dtd这种方式的校验,spring也已经不会保证几个9的稳定性。
Xml常常会被作为数据承载中介,使双方能够在跨平台跨语言的情况下松耦合的交互信息,也是现在的SOA的实施基础。那么双方势必需要有协议和数据格式规范来约束,schema作为dtd的新一代替代者已经广为使用。另一方面,xsd也早已独立于wsdl作为数据描述和可重用的数据描述说明被采用到各种互联网应用。
看看国外的Facebook,亚马逊,ebay等公司的REST风格的API,就可以清楚地了解到xsd十分适合作为轻量级的数据交互协议。在后续ASF中融入REST配置的实现中,也需要采用XSD这种Schema描述来实现数据交互解析。
因此替换掉Dtd的配置是迟早要做的一件事情,所以迟作不如早作,更避免拷贝引起的问题放大效果(不过这个问题由于要考虑QA和业务组的项目经理的顾虑,因此我只能做到的是建议)。
方案3:
看看Maven这些年这么火,其实在我们自己公司内部的antx同样都是在做一件事情,就是对于第三方的依赖包的版本控制。对于开源项目依赖的管理其实很重要,作的好项目能够很好的利用已有的成果,管理的不好就会被一些不太稳定的开源项目搞得头破血流。
记得在上次三亚的聚会上谈到了对于Tuscany的依赖,其实对于这个项目来说,如果要作为成熟的产品来说,那么势必要获取一个版本然后就作为稳定的依赖,而不是一味的升级更新,由于我们产品的特殊性以及早期的Tuscany的不成熟,因此我们仅仅只是使用了Tuscany的最核心解析文件框架部分,其他的插件都采取自己设计或者在原有设计上优化和更新的做法。当然这不是说对于所有的第三方依赖都是采取这样的策略,其实如果不是基础框架设计,仅仅只是应用级别的使用,只需要拿来主义就完全可以了。
回过头来看,大家现在对于类库的管理已经都很重视了,但是对于配置性的或者数据格式类的文件还没有引起足够的重视,不过看到很多朋友已经在本地作了这样的工作,不过就我来看,如果能够对dtd,schema作版本控制和服务器搭建,在长远来看还是有一定的好处的,只是说根据各自的需求来做这样的工作。
后续
问题出现的当天,我其实晚上就一直比较担心,因为如果问题不解决,那么将会影响到很多项目组(框架被使用的越广泛,自己所要承担的责任越重大)。其实也是由于自己上次对于这个问题的不上心,导致了问题的再次出现。刨根问底是件好事,做我们这行的还是需要多问一些为什么,这样就会少不少危急时刻的怎么办了。
很多时候为什么程序员自己喜欢什么都自己做,因为掌握在自己手中的事情总是能够解决,但是现在项目中对于第三方的依赖越来越多,在选择和控制上必须慎之又慎,有时候依赖也是双刃剑。
分享到:
相关推荐
通过编写单元测试,你可以确保XML解析和校验功能按预期工作。 总结来说,Castor结合XSD提供了强大的XML处理能力,能够简化XML数据的解析和验证,提高数据的准确性和一致性。理解并熟练运用这两个工具,是Java开发中...
FastXml类似XMLPULL一样,不校验文档schema和DTD,对文档的格式也不进行非常严格的校验:通常xml文档的格式都是正确的,当我们追求xml解析的最高性能时,就不需要对格式等内容进行及其严格的校验了。FastXml并不...
`MyHandlerTestValidate` 可能实现了XML解析和验证的具体功能,可能利用了SAX(Simple API for XML)或DOM(Document Object Model)等解析器。 2. `.classpath`:这是一个Eclipse项目配置文件,包含了项目的类路径...
它通过定义一系列的模式和规则,能够自动地创建和填充Java对象的结构,大大简化了XML解析的过程。 Digester的核心概念是模式(Pattern)和规则(Rule)。模式是指XML文档中的元素路径,类似于XPath表达式,用于...
本篇将详细介绍如何使用Java来解析Excel文件,并进行数据有效性校验。 1. **Java解析Excel库** 在Java中,有多个库可以用来解析Excel文件,如Apache POI、JExcelAPI、SimpleExcel等。Apache POI是目前最广泛使用的...
XML文档还包含头部声明和注释,头部声明指定了XML文档的版本和编码等信息,注释则用于提供文档内容的理解帮助,但不影响XML解析。 在.NET平台上,处理XML数据有两种方式:快速、无缓存、只能向前的流方式和文档对象...
5. **锁定依赖版本**:对于关键的、易引起问题的依赖,可以考虑将其版本锁定,避免因远程仓库中版本的变化而引入意外问题。 6. **测试覆盖率**:在修改依赖后,必须进行全面的测试,确保所有功能正常工作,包括单元...
Java中实现XML到Bean的转换,主要依赖于`JAXB (Java Architecture for XML Binding)` API。JAXB允许我们将XML文档映射到Java对象,反之亦然。在描述的代码中,可能包含了一个自定义的类加载器,这是为了动态加载Java...
- **数据交换**:API接口、Web服务等数据交互依赖于报文解析。 - **安全分析**:防火墙、入侵检测系统通过解析报文判断是否允许数据通过。 5. **优化与性能**:为了提高解析效率,可以采用预编译的正则表达式、位...
WebService基于标准的XML(可扩展标记语言)和WSDL(Web服务描述语言)进行交互,可以跨平台、跨语言地工作。SOAP(简单对象访问协议)是常用于传输数据的协议,它使用HTTP或HTTPS协议,确保了数据的安全性和可靠性...
这些工具一般提供了图形用户界面,方便技术人员进行配置文件的编辑、验证和分发,而背后的实现机制往往依赖于对XML的处理能力。 8. 兼容性与标准化 为确保不同厂商的IED设备之间能够无缝协作,XML文件的定义必须...
本文主要介绍了 SpringMVC 数据校验实例解析的实现过程,包括 pom 文件依赖项的添加、实体类的注解、JSP 页面的编写和 validate 方法的实现。希望本文能够对大家的学习和工作提供一定的参考价值。
而XercesImpl.jar则是Xerces项目的XML解析器实现,它提供了解析XML文档的基础功能。这两个库在处理HTML时,可以配合NekoHtml一起工作,帮助解析和转换复杂的HTML内容。 在使用NekoHtml解析HTML内容时,有几点需要...
2. 配置:在配置文件中启用Hibernate校验,例如在Spring框架中,需要在`web.xml`或`applicationContext.xml`中添加配置。 3. 注解声明:在实体类的字段上使用验证注解,例如`@NotBlank`表示字符串不能为空,`@Min(18...
`javax.xml.stream`是Java XML流API,它提供了处理XML事件(如开始元素、文本内容等)的低级接口,使得解析XML数据更加高效。Spring在处理XML输入和输出时可能用到这个API。 `net.sourceforge.iso-relax`是ISO ...
以JSSC为例,可以在`pom.xml`文件中添加如下依赖: ```xml <groupId>com.fazecast</groupId> <artifactId>jserialcomm <version>2.5.2 ``` 接着,我们需要创建一个服务类,实现串口的配置和数据处理。下面是...
当在pom.xml文件中设置了parent标签引用父项目时,可能会遇到引用报错的问题,这可能是因为依赖未能正确下载或者配置不正确造成的。本文将详细阐述Java pom.xml中parent引用报错问题的解决方案。 首先,pom.xml文件...
在IT行业中,数据库管理和数据操作是至关重要的环节。在给定的标题和描述中,我们关注的是一个使用Hibernate框架...然而,实际应用中还需要考虑数据的校验、错误处理以及性能优化等问题,确保整个流程的稳定性和效率。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传输数据。...它极大地提升了开发效率,减少了因数据格式问题引起的错误,是现代Web开发不可或缺的一部分。
在Spring框架中,AOP主要用于处理系统中的横切关注点,如日志记录、事务管理、权限校验等,这些关注点通常分散在多个类的方法中,通过AOP可以将其集中管理。 **XML配置AOP** 在Spring早期版本中,AOP主要通过XML...