不常见的408错误

近日,用jenkins打包Java程序,并发布在容器中,打包发布并没有什么问题,当容器启动的时候,mybatis的配置文件发生了错误,是很不常见的408错误,报错:
Caused by: java.io.IOException: Server returned HTTP response code: 408 for URL: http://www.mybatis.org/dtd/mybatis-3-config.dtd 。但是重新发布就好了。

不过还是不要这么麻烦,害得容器都起不来,于是下载了dtd文件,放在src\main\resources目录下,并将配置文件相关部分修改为:
<!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “classpath:/mybatis-3-config.dtd”>

再次重新发布,OK。

升级Log4j到Log4j2的痛,找不到Zookeeper的类

日前项目将日志软件由Log4j升级到Log4j2,项目使用了dubbo做分布式服务,因此需要使用zkclient连接到Zookeeper集群。
使用Idea的依赖树图,将已有jar包中包含Log4j的,全部选择除去,然后引入Log4j2,slf4j。日志输出格式为Json,因此还需要引入jackson-core和jacksson-databind。修改完之后,将几个子项目一一发布。结果有三个服务报错,错误为
Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.Watcher$Event$KeeperState
顾名思义,这是表示org.apache.zookeeper.Watcher$Event$KeeperState这个类没找到。但仔细查证,发布的项目中是包含Zookeeper的jar包的。那为什么找不到呢?网上有篇文章说,是消费端启动的时候,服务端没处在服务状态,多次重连之后抛出异常,造成这个错误。这个观点结合我的情况来看,并不适用,报错的子项目所依赖的服务,都很稳定正常地在运行,不存在这种原因。

后来想起来,其他正常运行的子项目和这几个项目有什么区别呢?一比较Zookeeper和Zkclient的部分,果然,exclusions部分不一样,不正常的子项目的zkClient没有这一部分,正常的包含这一部分。于是按照正常的子项目的pom.xml文件进行修改,去除了有关Log4j的依赖,再次发布,项目正常启动了。

综合分析,是因为依赖关系出错,造成zkClient不能正常初始化,因此在调用远程的dubbo服务时,就不能正常连到Zookeeper集群,在程序看来,就类似于消费端启动的时候,服务端没处在服务状态,多次重连之后抛出异常的情况。因此会有这个错误。