存档

2012年10月 的存档

BlazsDS中在MessageInterceptor里获取Flex层方法的注解

2012年10月17日 没有评论

  项目上的一蛋疼的需求,解决方案是需要在flex层进行一次拦截获取到方法上自定义的Annotation的信息来实现这个需求。下面是我分析BlazeDS后得到的获取flex层Method的Annotation的代码。

public class FlexMessageInterceptor implements MessageInterceptor {
 
 
	@Override
	public Message postProcess(MessageProcessingContext arg0, Message arg1,
			Message arg2) {
		return arg2;
	}
 
	@Override
	public Message preProcess(MessageProcessingContext arg0, Message arg1) {
 
 
		if(arg1 instanceof RemotingMessage){
			//记录日志的相关操作
			RemotingMessage remotingMessage = (RemotingMessage)arg1;
			//如果方法名为空则不记录日志,可能是flex自己的client ping等操作
			if(!StringUtil.isBlank(remotingMessage.getOperation())){
				MessageBroker messageBroker = MessageBroker.getMessageBroker("_messageBroker");
				RemotingDestination destination = (RemotingDestination)messageBroker.getService("remoting-service").getDestinations().get(arg1.getDestination());
 
				MethodMatcher methodMatcher = destination.getMethodMatcher();
				FactoryInstance factoryInstance = destination.getFactoryInstance();
				Object instance = factoryInstance.lookup();
				//这个method是cglib代理了的,不知道是不是我用spring整合了BlazsDS的原因
				Method method = methodMatcher.getMethod(instance.getClass(), remotingMessage.getOperation(), remotingMessage.getParameters());
 
				//所以需要用spring提供的一个工具来获取方法的注解
				ModuleLog moduleLog = AnnotationUtils.findAnnotation(method,ModuleLog.class);
 
				//记录日志
				if(moduleLog!=null){
					//做该做的事情
				}
			}
		}
 
		return arg1;
	}
 
}

其余不做过多解释,debug两下基本就可以拿到自己想要的东西。如果疑问留言。

分类: 源码分享, 高级民工 标签: