文档章节

Ice Service Annotation

金贞花
 金贞花
发布于 2017/01/11 10:25
字数 406
阅读 45
收藏 0
ice
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value=ElementType.FIELD)
public @interface IceService {
	
	/**
	 * 远程ice服务的identify,当为空时默认取当前定义的Filed的字符串
	 */
	String name() default "";
	
	/**
	 * 如果未找到对应服务时,是否报错
	 */
	boolean check() default false;

}

 


import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.core.io.Resource;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.ReflectionUtils.FieldFilter;

import com.google.common.collect.Maps;

import Ice.InitializationData;
import Ice.ObjectPrx;
import Ice.Util;

public class IceServiceProcessor extends InstantiationAwareBeanPostProcessorAdapter {

	private static Map<String, ObjectPrx> remoteIceServiceReferenceCache = Maps.newHashMap();

	private String clientConfig = "iceclient.properties";

	private static volatile Ice.Communicator ic = null;
	
	private Resource resource;

	/**
	 * 理论上一个Controller Bean 只会被处理一次
	 */
	@Override
	public boolean postProcessAfterInstantiation(final Object bean, String beanName) throws BeansException {
		ReflectionUtils.doWithFields(bean.getClass(), new ReflectionUtils.FieldCallback() {
			@Override
			public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
				// 某个类型的IcePrx
				Class<?> icePrxClass = field.getType();
				IceService iceServiceDefine = field.getAnnotation(IceService.class);
				String identityName = iceServiceDefine.name();
				if (StringUtils.isBlank(identityName)) {
					identityName = field.getName();
				}
				// 是否强制检测
				boolean strongCheck = iceServiceDefine.check();
				ObjectPrx target = null;
				try {
					target = getSerivcePrx(identityName, icePrxClass);
				} catch (IOException e) {
					e.printStackTrace();
				}
				if (strongCheck && (target == null)) {
					throw new IllegalArgumentException("未找到" + iceServiceDefine.name() + "的远程服务");
				}
				ReflectionUtils.makeAccessible(field);
				field.set(bean, target);
			}
		}, new FieldFilter() {
			@Override
			public boolean matches(Field field) {
				// 排除静态属性和final属性
				boolean basicCondition = !(Modifier.isStatic(field.getModifiers())|| Modifier.isFinal(field.getModifiers()));
				// 只取带有IceService注解的属性
				return basicCondition && field.getAnnotation(IceService.class) != null;
			}
		});
		return true;
	}

	public Ice.Communicator getICECommunictor() throws IOException {
		if (ic == null) {
			InitializationData initData = new InitializationData();
			initData.properties = Util.createProperties();
			if(resource!=null){
				initData.properties.load(resource.getFile().getAbsolutePath());
			}else{
				initData.properties.load(getClientConfig());
			}
			ic = Util.initialize(initData);
		}
		return ic;
	}

	private static ObjectPrx createIceProxy(Ice.Communicator communicator, Class<?> serviceCls, String identityName) {
		ObjectPrx proxy = null;
		String clsName = serviceCls.getName();
		int pos = clsName.lastIndexOf("Prx");
		if (pos <= 0) {
			throw new java.lang.IllegalArgumentException("Invalid ObjectPrx class, class name must end with Prx");
		}
		try {
			Class<?> proxyClass = Class.forName(clsName + "Helper");
			Ice.ObjectPrx base = communicator.stringToProxy(identityName);
			proxy = (ObjectPrx) proxyClass.newInstance();
			Method checkedCast = proxyClass.getDeclaredMethod("checkedCast", ObjectPrx.class);
			proxy = (ObjectPrx) checkedCast.invoke(proxy, base);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return proxy;
	}

	public ObjectPrx getSerivcePrx(String identityName, Class<?> serviceCls) throws IOException {
		String token = serviceCls + "_" + identityName;
		ObjectPrx proxy = remoteIceServiceReferenceCache.get(token);
		if (proxy != null) {
			return proxy;
		}
		proxy = createIceProxy(getICECommunictor(), serviceCls, identityName);
		if (proxy != null) {
			remoteIceServiceReferenceCache.put(token, proxy);
		}
		return proxy;
	}
 
	public String getClientConfig() {
		return clientConfig;
	}

	public void setClientConfig(String clientConfig) {
		this.clientConfig = clientConfig;
	}
	
	public Resource getResource() {
		return resource;
	}

	public void setResource(Resource resource) {
		this.resource = resource;
	}
}

 

© 著作权归作者所有

金贞花

金贞花

粉丝 162
博文 18
码字总数 3681
作品 0
朝阳
程序员
私信 提问
笨笨D幸福/ice

Ice - Comprehensive RPC Framework Ice helps you network your software with minimal effort. By taking care of all interactions with low-level network programming interfaces, Ice ......

笨笨D幸福
2017/05/05
0
0
TCP/IP、HTTP、WEBSERVICE、SOAP、ICE都使用后才有感慨

TCP是TCP/IP的第三层传输层,对应OSI的第四层传输层; IP是TCP/IP的第二层互联层,对应OSI的第三层网络层。 ICE(Internet Communications Engine)是ZeroC提供的一款高性能的中间件,基于ICE...

长征2号
2017/09/06
0
0
openstack ice版availability zones host aggregates 实战详解

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息。 Better Me的博客:blog.csdn.net/tantexian 如需交流,欢迎大...

tantexian
2016/03/29
88
0
Java的Annotation标签

只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service,但不是所有的Java类都可以发布成Web Service。Java类若要成为一个实现了Web Service的bean,它需要遵循下边这些...

Sam_鸿发
2015/09/08
20
0
Spring execution 表达式

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) 除了返回类型模式(上面代码片断中的ret-type-pattern),名字模式......

alonelywolf
2014/12/20
97
0

没有更多内容

加载失败,请刷新页面

加载更多

个人服务容器化和监控集成

1.前景 自己比较喜欢玩机器,目前手上有4台常用的机器 asw 1核1G 阿里云 1核2G 腾讯云 1核1G 百度云 2核4G

MrPei
9分钟前
2
0
Rancher源码编译

源码包准备 mkdir -p $GOPATH/src/github.com/ranchercd $GOPATH/src/github.com/ranchergit clone https://github.com/rancher/rancher.gitcd ranchergit checkout v2.2.3-rc9 注1......

深蓝苹果
13分钟前
3
0
7个理由,给你推荐这款“秒杀Excel”的分析神器!

谈到数据分析,自然离不开赖以使用的数据分析工具。 商业智能时代,可用于数据分析的工具有很多,Python、R......还有各式各样的专业工具。其中,Excel也是推荐的比较多的一种,尤其是刚入门...

朕想上头条
27分钟前
2
0
Spring5 源码分析-容器刷新-解析配置类-主流程

上一篇:Spring5 源码分析-容器刷新-invokeBeanFactoryPostProcessors()方法 此篇是上一篇方法中非常非常重要的功能,也是Spring核心功能,完成所有的BeanDefinition注册。 详细的主流程,如...

特拉仔
28分钟前
2
0
Python 3.8.0 正式发布 更新内容

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的...

阮鹏
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部