1. Caused by: java.lang.reflect.MalformedParameterizedTypeException
啟動時報錯,原因是dubbo 依賴 spring 2.5.6.SEC03,而我項目中有用spring 3.2.4.RELEASE,所以導致沖突。 在maven中把dubbo中的spring依賴去除就可以了。
如果你們項目中也報這個錯,很可能也是因為jar包沖突造成的
1
2
3
4
5
6
7
8
9
10
|
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
|
2. Caused by: java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher
at org.springframework.context.config.ContextNamespaceHandler$1.parse(ContextNamespaceHandler.java:65)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1297)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1287)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398)
... 22 more
錯誤原因:http://stackoverflow.com/questions/23813369/spring-java-error-namespace-element-annotation-config-on-jdk-1-5-and-high
因為使用了 jdk1.8, 而dubbo 依賴 Spring 2.5 ,而Spring2.5僅僅支持 jdk1.5 到 jdk 1.7, 所以jdk 1.8 不被識別,所以報錯。
3. Caused by: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 46; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但無法找到元素 'dubbo:application' 的聲明。
該錯誤是因為沒有引入 dubbo jar包。加上依賴就行了:
1
2
3
4
5
|
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
</dependency>
|
4. Unsupported major.minor version 52.0 (unable to load class
出現該錯誤是由於class編譯器的JDK版本高於運行期的JDK版本。
比如我在運行Tomcat servlet時出現該錯誤,是由於tomcat運行時是1.7的JDK,Eclipse編譯時則是1.8
修改方法:保證編譯器和運行期的JDK版本一致。
二: 總結所有問題 ----->
1. 如果服務注冊不上怎么辦?
(1) 檢查dubbo的jar包有沒有在classpath中,以及有沒有重復的jar包
(2) 檢查有沒有重復的dubbo.properties配置文件
(3) 檢查暴露服務的spring配置有沒有加載
(4) 檢查beanId或beanName有沒有重復
(5) 查看有沒有錯誤日志: cat ~/output/logs/webx.log
(6) 在服務提供者機器上測試與注冊中心的網絡是否通: telnet 172.22.3.94 9090
(7) 檢查與注冊中心的連接是否存在: netstat -anp | grep 172.22.3.94
(8) 如果是預發布機,檢查hosts文件有沒有正確綁定: cat /etc/hosts
(9) 實在不行,開啟遠程調試:
– (a) 在服務器JVM參數中加入:-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=7001,server=y,suspend=y 注意線上只有7001和8080可以被線下訪問,調試端口需用這兩個之一,因注冊是啟動時行為,啟動時必需掛起suspend=y
– (b) 在dubbo源碼的DefaultRegistryService的registerService()方法中設置斷點。
– (c) 在Eclipse的Debug按鈕下拉菜單Debug Configurations中的Remote Java Applications中新增遠程調試,並設置IP和端口,以及增加dubbo的源碼,進行遠程Debug調試。
2. 出現RpcException: No provider available for remote service異常怎么辦?
表示沒有可用的服務提供者,
1. 檢查連接的注冊中心是否正確
2. 到注冊中心查看相應的服務提供者是否存在
3. 檢查服務提供者是否正常運行
3. 出現調用超時com.alibaba.dubbo.remoting.TimeoutException異常怎么辦?
通常是業務處理太慢,可在服務提供方執行:jstack PID > jstack.log 分析線程都卡在哪個方法調用上,這里就是慢的原因。 如果不能調優性能,請將timeout設大。
4. 出現hessian序列化失敗com.caucho.hessian.client.HessianRuntimeException怎么辦?
1. 檢查服務方法的傳入傳出參數是否實現Serializable接口 2. 檢查服務方法的傳入傳出參數是否繼承了Number,Date,ArrayList,HashMap等hessian特殊化處理的類
5. 出現Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://repo.alibaba-inc.com/schema/dubbo]怎么辦?
表示spring找不到<dubbo:...>配置的解析處理器。 通常是Dubbo的jar沒有引入,請加入對Dubbo的依賴,或者是ClassLoader隔離,看是否有使用osgi或其它熱加載機制。
6. 出現"消息發送失敗"異常怎么辦?
通常是接口方法的傳入傳出參數未實現Serializable接口。
7. 出現org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'異常怎么辦?
表示xsd加載失敗, 1. 檢查spring版本,如果是spring2.0版本,因為該版本不能讀取jar包內xsd,會讀取外網的xsd,而線上環境通常不允許訪問外網, 可修改/etc/hosts加入:(已將spring的xsd放在公司內部的maven倉庫中) 10.20.133.138 repo.alibaba-inc.com www.springframework.org spring2.5.x版本不存在此問題,可以考慮升級到2.5.x版本。 2. 檢查有沒有使用osgi的xsd,如果用了,需要將spring-osgi.jar及其依賴包加進來
8. 項目依賴的三方庫與Dubbo所依賴的版本沖突怎么辦。
比如,項目使用的spring和commons.pool與dubbo沖突, dubbo使用的是spring2.5和commons.pool1.4, 而項目中其它模塊依賴的是spring2.0.1和commons.pool1.3。 1. 在Maven中,使用項目根pom.xml中的dependencyManagement版本仲裁解決: <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.external</groupId> <artifactId>sourceforge.spring</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>com.alibaba.external</groupId> <artifactId>jakarta.commons.poolg</artifactId> <version>1.3</version> </dependency> </dependencies> </dependencyManagement> 2. 在Antx中,使用項目根project.xml中版本仲裁解決: <projects name="thirdpart"> <project id="sourceforge/spring" version="2.0.1"/> <project id="jakarta/commons/pool" version="1.3"/> </projects>
9. 出現java.util.concurrent.RejectedExecutionException或者Thread pool exhausted怎么辦?
RejectedExecutionException表示線程池已經達到最大值,並且沒有空閑連,拒絕執行了一些任務。 Thread pool exhausted通常是min和max不一樣大時,表示當前已創建的連接用完,進行了一次擴充,創建了新線程,但不影響運行。 原因可能是連接池不夠用,請調整dubbo.properites中的: // 設成一樣大,減少線程池收縮開銷 dubbo.service.min.thread.pool.size=200 dubbo.service.max.thread.pool.size=200 配置項說明請參見:配置參考手冊 如果線程池已經有200,還不夠,通常是業務處理占用線程時間過長, 需優化業務,可通過運行: jstack 進程號 > jstack.txt 分析當前大多數線程都在干什么,從而分析出哪個地方是瓶頸, 比如,如果大部分線程都在處理SQL,可能是數據庫連接不夠,或數據源配置錯誤,或SQL沒走索引等。
10. 出現com.alibaba.dubbo.registry.internal.rpc.exception.RpcLocalExceptionIoTargetIsNotConnected怎么辦?
1. 檢查注冊中心是否開啟白名單功能,如果開啟,當IP不在白名單列表中,注冊中心將拒絕連接。 2. 檢查端口是否正確,注冊中心有兩個端口,一個為控制台HTTP端口,用於管理員查看數據,一個為程序注冊服務用的TCP端口。
11. 出現Remote server returns error: [6], Got invocation exception怎么辦?
此異常表示Dubbo框架調用服務提供者的實現方法失敗,並且不是方法本身的業務異常。 通常是服務消費者和服務提供者的API簽名不一致引起,或者提供方比消費方少此函數。 一般是服務增加方法,或修改了方法簽名,而雙方用的服務API的jar包不一致。
12. 出現Error closing connection/tbr-client java.lang.NullPointerException怎么辦?
如果服務提供者先關閉,當注冊中心通知服務消費者后,服務消費者會再次關閉與服務提供者的連接, 而此時連接早已不存在,TBRemoting沒有判斷null,直接調用了close方法,所以會拋出空指針異常, 由於TBRemoting源碼由taobao管理,暫時未解決此BUG,但不影響使用,可忽略。 Dubbo1.0.11-3以后版本已hack了taobao的代碼,不存在此問題。
13. 出現org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxService': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: Method must not be null怎么辦?
通常是classpath下存在spring多個版本的jar包,排除掉不需要的spring包即可。
14. 出現Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'applicationName' of bean class [com.alibaba.dubbo.registry.internal.DefaultRegistryService]: Bean property 'applicationName' is not writable or has an invalid setter method.怎么辦?
出現類似的dubbo某個類的屬性沒有setter方法的異常,通常是classpath下有多個不同版本的dubbo的jar包,導致配置文件與類不匹配。 可以在程序中運行下面的代碼發現重復的類或jar包:(代碼中的類名視具體沖突而定) Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources("com/alibaba/dubbo/registry/internal/DefaultRegistryService.class"); while (urls.hasMoreElements()) { URL url = urls.nextElement(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>" + url.getFile()); }
15. 服務提供者沒掛,但在注冊中心里看不到怎么辦?
首先,確認服務提供者是否連接了正確的注冊中心,不只是檢查配置中的注冊中心地址,而且要檢查實際的網絡連接. 其次,看服務提供者是否非常繁忙,比如壓力測試,以至於沒有CPU片段向注冊中心發送心跳,這種情況,減小壓力,將自動恢復。
16. 出現ERROR monitor.StatLog -拒絕連接 java.net.ConnectException:拒絕連接 com.alibaba.dubbo.monitor.StatLog.sendStatData怎么辦?
監控中心不可用,發送統計信息失敗,不影響調用,但將丟失統計信息。
17. 服務地址出現127.0.0.1怎么辦?
Dubbo1.0.7以后版本不存在此問題,當發現本機IP為127.0.0.1時,將遍歷所有網卡查找有效IP。 之前版本處理方式: 正確配置的IP映射,Linux下為/etc/hosts,Windows下為C:/WINDOWS/system32/drivers/etc/hosts 假設:ifconfig命令行結果為10.20.130.230,hostname命令行結果為test2, 則配置為: 127.0.0.1 localhost 10.20.130.230 test2
18. 通過netstat -anp看到連接的注冊中心和配置的不一樣怎么辦?
檢查classpath下是否存在兩個dubbo.properties文件: Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources("dubbo.properties"); while (urls.hasMoreElements()) { URL url = urls.nextElement(); System.out.println(">>>>>>>>>>>>>>>>>>>>>>" + url.getFile()); }
19. 客戶端的異常信息里的errorcode是什么意思?
如Remote server returns error: [6], Got invocation exception 1 — 收到消息的時候線程池拒絕處理 2 — 服務提供者端未能根據服務名找到相應服務 3 — 該服務調用時,服務提供者端不能加載參數類型對應的class 4 — 參數不能被正確的反序列化 5 — 不能正確從Class中create該調用所指示的方法 6 — 不能正確調用該方法
20. 出現expected string at 0×33 java.lang.String 怎么辦?
這是Hessian3.2.1的一個BUG,Dubbo內部使用Hessian3.2.1做序列化,升級到Dubbo1.0.14以上版本,已解決此問題。 具體原因參見: http://pt.alibaba-inc.com/wp/experience_929/hessian-big-string-serialize-problems.html
21. 預發布環境,在本地的/etc/hosts文件作了對注冊中心的綁定,為什么服務還是注冊到生產環境的注冊中心?
antx.properties中配置的 dubbo.registry.address = dubbo-reg1.hst.xyi.cn.alidc.net dubbo-reg2.hst.xyi.cn.alidc.net dubbo-reg3.hst.xyi.cn.alidc.net dubbo-reg4.hst.xyi.cn.alidc.net 而/etc/hosts里的綁定如下: 172.22.14.13 dubbo-reg1.hst.xyi.cn.alidc.net dubbo-reg2.hst.xyi.cn.alidc.net 兩邊的不一致,導致該問題出現。 將綁定修改為:172.22.14.13 dubbo-reg1.hst.xyi.cn.alidc.net dubbo-reg2.hst.xyi.cn.alidc.net dubbo-reg3.hst.xyi.cn.alidc.net dubbo-reg4.hst.xyi.cn.alidc.net 即可! 22. 注冊中心上服務是存在的,為什么報找不到服務的錯誤?
報錯信息: Caused by: com.alibaba.dubbo.rpc.RpcException: No invoker available for remote service com.alibaba.china.album.service.IBankNewPicService:1.0.0, servers: [] 注冊中心上看到的服務提供者提供的服務地址是:dubbo://172.29.61.76:55372?version=1.0.0&group=ibank&dubbo=1.0.0&application=ibank 原因:服務提供者配置了group屬性,默認的路由規則是 服務名= group/serviceName。 對這個服務,根據默認的路由規則,消費者消費的服務名應該是 ibank/com.alibaba.china.album.service.IBankNewPicService:1.0.0
23. 獲取版本號出現java.lang.NullPointerException怎么辦?
java.lang.NullPointerException at com.alibaba.dubbo.classic.DubboVersion.getVersion 這個只有1.0.14和1.0.14-2存在的問題,在獲取版本時靜態字段初始化順序不對,不影使用,可忽略,升級為1.0.15以上版本不再會有該問題。
24. 以及配置中如何使用占位符?
注:此為Spring的標准功能,僅在此提示使用方式,不屬於Dubbo范疇。 使用Spring自帶的PropertyPlaceholderConfigurer實現properties配置: xxx=10.20.130.230:9090 yyy=morgan <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://repo.alibaba-inc.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://repo.alibaba-inc.com/schema/dubbohttp://repo.alibaba-inc.com/schema/dubbo/dubbo-component.xsd"> <!-- 使用Spring自帶的占位符替換功能 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <!-- 指定properties配置所在位置 --> <property name="location" value="classpath:xxx.properties" /> </bean> <!-- 使用${}引用配置項 --> <dubbo:registry address="${xxx}" application="${yyy}" /> </beans>
25. 使用多個進程啟動服務,端口沖突怎么辦?
注:此為Spring的標准功能,僅在此提示使用方式,不屬於Dubbo范疇。 使用Spring自帶的PropertyPlaceholderConfigurer的SYSTEM_PROPERTIES_MODE_OVERRIDE實現通過-D參數設置端口: java -Ddubbo.service.server.port=20881 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://repo.alibaba-inc.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://repo.alibaba-inc.com/schema/dubbohttp://repo.alibaba-inc.com/schema/dubbo/dubbo-component.xsd"> <!-- 使用Spring自帶的占位符替換功能 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <!-- 系統-D參數覆蓋 --> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <!-- 指定properties配置所在位置 --> <property name="location" value="classpath:xxx.properties" /> </bean> <!-- 使用${}引用配置項 --> <dubbo:provider port="${dubbo.service.server.port}" /> </beans>
26. 如何加載Spring?
注:此為Spring的標准功能,僅在此提示使用方式,不屬於Dubbo范疇。 1. 基於ClassPath加載: ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[}{"http://10.20.160.198/wiki/display/dubbo/service.xml"}); context.start(); 2. 基於文件系統加載: FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(new String[}{"http://10.20.160.198/home/xxx/service.xml"}); context.start(); 3. 基於Web容器加載:(WEB-INF/web.xml) <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd" id="appication" version="2.4"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:service.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
27. 出現org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element怎么辦?
通常是在用Dubbo1.0的jar包,卻用了Dubbo2.0才支持的<dubbo:registry> <dubbo:application> <dubbo:provider> <dubbo:consumer>或2.0才支持的屬性。
28. 出現Could not deserialize parameter instance, error is: readObject: unexpected end of file怎么辦?
通常是消費方或提供方的內存不足,導致buffer不能分配,使發送到一半的請求被中斷了。 也可能是網絡抖動,導致傳輸流被中斷。
29. 出現java.net.SocketException: Invalid argument: sun.nio.ch.Net.setIntOption怎么辦?
通常是Windows Vista和Windows7的JDK1.6的部分版本存在BUG: https://issues.apache.org/jira/browse/DIRMINA-379 可以換換JDK版本試試。