服務消費者:
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION)
UserService userService;
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION)
TenantService tenantService;
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION)
private UserPermissionService userPermissionService;
在使用這些對象的時候直接報空指針異常:
public UserDTO getUserDTOByClientId(String clientId) {
log.info("userservice======"+userService);
return userService.getUserInfo(clientId);
}
經確認–打印對象爲null。
分析:
由於運維腳本衝突,所以每次啓動需要先啓動服務消費者,再啓動服務提供者,查看日誌zk能夠notify服務消費者提供者的註冊信息,但是調用的時候對象獲取不到–NullpointException。
解決方案
1、採用懶加載:
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,lazy = true)
UserService userService;
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,lazy = true)
TenantService tenantService;
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,lazy = true)
private UserPermissionService userPermissionService;
2、首先啓動服務提供者,然後再啓動服務消費者。
3、通過查閱資料認爲,dubbo註解設置中有個check參數設置爲 check=false
,當服務提供者還沒有啓動的時候,服務消費者會在對象初始化的時候,創建相應的代理對象,不會產生一個null對象。這種方案相對比較合適,推薦使用。
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,check = false)
UserService userService;
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,check = false)
TenantService tenantService;
@Reference(version = DubboConfig.INNOVATION_SERVICE_USER_VERSION,check = false)
private UserPermissionService userPermissionService;
詳情可參考:http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html