package com.jthink.skyeye.data.dubbox;
import com.alibaba.dubbo.config.*;
import com.alibaba.dubbo.config.utils.ReferenceConfigCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* JThink@JThink
*
* @author JThink
* @version 0.0.1
* @desc 提供暴露和获取service的方法
* @date 2016-12-15 14:23:24
*/
public class DubboService {
private static final Logger LOGGER = LoggerFactory.getLogger(DubboService.class);
private ApplicationConfig applicationConfig;
private RegistryConfig registryConfig;
private ProtocolConfig protocolConfig;
private DubboProperties dubboProperties;
private ReferenceConfigCache referenceConfigCache;
private static Map<Class<?>, ReferenceConfig<?>> referenceConfigMap = new ConcurrentHashMap<Class<?>, ReferenceConfig<?>>();
public DubboService(ApplicationConfig applicationConfig, RegistryConfig registryConfig, ProtocolConfig protocolConfig, DubboProperties dubboProperties, ReferenceConfigCache referenceConfigCache) {
this.applicationConfig = applicationConfig;
this.registryConfig = registryConfig;
this.protocolConfig = protocolConfig;
this.dubboProperties = dubboProperties;
this.referenceConfigCache = referenceConfigCache;
}
public DubboService(ApplicationConfig applicationConfig, RegistryConfig registryConfig, DubboProperties dubboProperties, ReferenceConfigCache referenceConfigCache) {
this.applicationConfig = applicationConfig;
this.registryConfig = registryConfig;
this.dubboProperties = dubboProperties;
this.referenceConfigCache = referenceConfigCache;
}
/**
* 将服务暴露出去
* @param service
* @param serviceImpl
* @param <T>
*/
public <T> void export(Class<?> service, T serviceImpl) {
ServiceConfig<T> serviceConfig = new ServiceConfig<T>();
serviceConfig.setInterface(service);
serviceConfig.setRef(serviceImpl);
serviceConfig.setApplication(this.applicationConfig);
serviceConfig.setRegistry(this.registryConfig);
serviceConfig.setProtocol(this.protocolConfig);
serviceConfig.setTimeout(this.dubboProperties.getTimeOut());
serviceConfig.setRetries(this.dubboProperties.getRetries());
serviceConfig.export();
}
/**
* 获取dubbo暴露的service
* @param clazz
* @param <T>
* @return
*/
@SuppressWarnings("unchecked")
public <T> T get(Class<T> clazz) {
ReferenceConfig<?> referenceConfig = referenceConfigMap.get(clazz);
if (null == referenceConfig) {
synchronized (clazz) {
referenceConfig = referenceConfigMap.get(clazz);
if (null == referenceConfig) {
referenceConfig = getReferenceConfig(clazz);
referenceConfigMap.put(clazz, referenceConfig);
}
}
}
T t = null;
try{
t = (T) referenceConfigCache.get(referenceConfig);
} catch (Exception e) {
LOGGER.info("dubbo 获取远程服务异常", e);
}
return t;
}
private <T> ReferenceConfig<T> getReferenceConfig(Class<T> clazz) {
ReferenceConfig<T> reference = new ReferenceConfig<T>();
reference.setApplication(applicationConfig);
reference.setRegistry(registryConfig);
reference.setRetries(dubboProperties.getRetries());
reference.setInterface(clazz);
reference.setTimeout(dubboProperties.getTimeOut());
return reference;
}
}