今天做 Spring Boot 项目中集成 Apollo 和 Cat 时遇到一个一些异常,异常内容大致如下:
java.lang.IllegalStateException: java.lang.reflect. InvocationTargetException
at com.ctrip.framework.apollo.tracer.internals.cat.CatMessageProducer.newTransaction(CatMessageProducer.java:81) ~[apollo-core-1.1.0.jar:1.1.0]
...
Caused by: java.lang.ExceptionInInitializerError: null
at com.dianping.cat.message.internal.DefaultMessageManager.<init>(DefaultMessageManager.java:45) ~[cat-client-3.0.0.jar:na]
...
Caused by: java.lang.RuntimeException: Error when get cat router service, please contact cat support team for help!
at com.dianping.cat.configuration.ApplicationEnvironment.loadClientConfig(ApplicationEnvironment.java:151) ~[cat-client-3.0.0.jar:na]
...
Caused by: java.net.UnknownHostException: org.cat
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_191]
...
java.lang.IllegalStateException: java.lang.reflect.InvocationTargetException
at com.ctrip.framework.apollo.tracer.internals.cat.CatMessageProducer.logEvent(CatMessageProducer.java:62) ~[apollo-core-1.1.0.jar:1.1.0]
...
这个异常的根本原因是没有正确连接到 Cat 服务器。客户端如果没有找到 Cat 配置文件,则会去连接“org.cat”这个地址。Cat 客户端的配置很特殊,并不能通过 Spring Boot 的 properties文件或者环境变量来配置,它是通过特定目录下的 client.xml 文件来配置的。
在 Linux 下,这个目录是:
/data/appdatas/cat
在 Windows 下,这个目录和启动进程在同一个磁盘分区下的 /data/appdatas/cat。如果集成 Cat 客户端的 Spring Boot 程序在 D 盘运行,那么这个目录的地址就是:
D:\data\appdatas\cat
如果 client 文件在 D 盘(D:\data\appdatas\cat\client.xml),而 Spring Boot 程序在 E 盘,当运行 Spring Boot 程序时就找不到 client.xml 文件,会报“java.net.UnknownHostException: org.cat”相关的异常。
将 client.xml 文件和 Spring Boot 项目放在同一个磁盘分区就能解决这个问题。