/** * Dianping.com Inc. * Copyright (c) 2003-${year} All Rights Reserved. */ package com.dianping.pigeon.remoting.provider.process.filter; import java.util.List; import com.dianping.pigeon.log.Logger; import com.dianping.pigeon.log.LoggerLoader; import com.dianping.pigeon.remoting.common.domain.InvocationRequest; import com.dianping.pigeon.remoting.common.domain.InvocationResponse; import com.dianping.pigeon.remoting.common.domain.InvocationContext.TimePhase; import com.dianping.pigeon.remoting.common.domain.InvocationContext.TimePoint; import com.dianping.pigeon.remoting.common.process.ServiceInvocationFilter; import com.dianping.pigeon.remoting.common.process.ServiceInvocationHandler; import com.dianping.pigeon.remoting.common.util.Constants; import com.dianping.pigeon.remoting.provider.domain.ProviderChannel; import com.dianping.pigeon.remoting.provider.domain.ProviderContext; import com.dianping.pigeon.remoting.provider.process.ProviderInterceptor; import com.dianping.pigeon.remoting.provider.process.ProviderInterceptorFactory; import com.dianping.pigeon.remoting.provider.process.ProviderProcessInterceptor; import com.dianping.pigeon.remoting.provider.process.ProviderProcessInterceptorFactory; public class WriteResponseProcessFilter implements ServiceInvocationFilter<ProviderContext> { private static final Logger logger = LoggerLoader.getLogger(WriteResponseProcessFilter.class); @Override public InvocationResponse invoke(ServiceInvocationHandler handler, ProviderContext invocationContext) throws Throwable { try { ProviderChannel channel = invocationContext.getChannel(); InvocationRequest request = invocationContext.getRequest(); InvocationResponse response = handler.handle(invocationContext); if (request.getCallType() == Constants.CALLTYPE_REPLY) { invocationContext.getTimeline().add(new TimePoint(TimePhase.P)); channel.write(invocationContext, response); invocationContext.getTimeline().add(new TimePoint(TimePhase.P)); } if (request.getMessageType() == Constants.MESSAGE_TYPE_SERVICE) { List<ProviderProcessInterceptor> interceptors = ProviderProcessInterceptorFactory.getInterceptors(); for (ProviderProcessInterceptor interceptor : interceptors) { interceptor.postInvoke(request, response); } List<ProviderInterceptor> contextInterceptors = ProviderInterceptorFactory.getInterceptors(); for (ProviderInterceptor interceptor : contextInterceptors) { interceptor.postInvoke(invocationContext); } } return response; } finally { // ContextUtils.clearContext(); // ContextUtils.clearLocalContext(); } } }