Skip to content
This repository has been archived by the owner on Nov 24, 2018. It is now read-only.

排查问题

hengyunabc edited this page Apr 29, 2016 · 2 revisions

当遇到没有办法把变量注入到Spring的${}表达式时,可以按下面的步骤来排查。

把日志开关打开

暂时去掉项目里的所有日志配置,把所有的日志全设置为level为DEBUG。比如logbakc的配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<charset>utf-8</charset>
			<Pattern>[%p] %c - %m%n</Pattern>
		</encoder>
	</appender>
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
	</root>
</configuration>

如果成功设置的话,可以看到详细的xdiamond client连接服务器的细节信息,包括tcp数据流信息。

检查fastjson版本

因为fastjson的低版本在处理循环引用时有bug,所以建议和xidamond client里依赖的版本一致。

参考:https://github.com/hengyunabc/xdiamond/issues/6

检查XDiamond Client的配置是不是放在Spring配置的最前面

建议有一个application-root.xml,里面在最前面配置XDiamond Client,然后再在后面import其它的Spring配置。

检查有没有使用 <context:property-placeholder/>

如果有使用<context:property-placeholder/> ,则其它配置的PropertySourcesPlaceholderConfigurer bean都不会生效。

这个是Spring自身的问题。尽管使用<context:property-placeholder/> 很方便,但是建议最好不要使用。

如果是Web项目,要注意有两个不同的Spring Context

当在web项目时,通常会有两个Spring Context,一个是平常的Spring Context,在web.xml里的Listener加载的。另外一个是Spring MVC的Context。它们俩是父子关系。父Context里获取不到子Context里的Bean信息的。

详细可以参考:http://blog.csdn.net/hengyunabc/article/details/47072637

建议在两个Spring Context的主配置文件里都import XDiamond Client的配置。

终极排查问题办法,去掉XDiamond Client的配置,改为加载本地Properties

有一个终极的排查问题办法,就是去掉XDiamond Client的配置。因为从原理上,XDiamond Client是提供了一个Properties对象,然后把这个Properties交给Spring的PropertySourcesPlaceholderConfigurer。

可以从XDiamond Server的界面上,或者XDiamond Client启动的日志上,获取到所有的配置,保存为一个本地的Properties文件,然后再加载。

类似下面的方法:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:local.properties" />

如果还是报错,则不是XDiamond Client引起的问题。

注意一些奇怪的配置

比如检查配置是否有空格,这种容易在url或者ip上出现,这种容易出现初始化错误。

建议只配一个PropertyPlaceholderConfigurer对象,或者把它们都配置在一个xml里,并且尽早import

当有多个PropertyPlaceholderConfigurer时,容易出现覆盖等现象,需要特别注意。