/** * Dianping.com Inc. * Copyright (c) 00-0 All Rights Reserved. */ package com.dianping.pigeon.remoting.provider.process; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; 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.util.Constants; import com.dianping.pigeon.remoting.provider.config.ServerConfig; import com.dianping.pigeon.remoting.provider.domain.ProviderContext; import com.dianping.pigeon.remoting.provider.listener.RequestTimeoutListener; import com.dianping.pigeon.remoting.provider.process.threadpool.RequestThreadPoolProcessor; import com.dianping.pigeon.remoting.provider.util.ProviderUtils; import com.dianping.pigeon.threadpool.DefaultThreadPool; import com.dianping.pigeon.threadpool.ThreadPool; import com.dianping.pigeon.util.ThreadPoolUtils; public abstract class AbstractRequestProcessor implements RequestProcessor { private static ThreadPool timeCheckThreadPool = new DefaultThreadPool("Pigeon-Provider-Timeout-Checker"); protected Map<InvocationRequest, ProviderContext> requestContextMap = new ConcurrentHashMap<InvocationRequest, ProviderContext>(); protected static final Logger logger = LoggerLoader.getLogger(RequestThreadPoolProcessor.class); protected RequestTimeoutListener requestTimeoutListener = new RequestTimeoutListener(this, requestContextMap); protected volatile ServerConfig serverConfig; public AbstractRequestProcessor() { timeCheckThreadPool.execute(requestTimeoutListener); } public abstract Future<InvocationResponse> doProcessRequest(final InvocationRequest request, final ProviderContext providerContext); public abstract void doStart(); public void start(ServerConfig serverConfig) { this.serverConfig = serverConfig; doStart(); } public abstract void doStop(); public void stop() { ThreadPoolUtils.shutdown(timeCheckThreadPool.getExecutor()); doStop(); } public Map<InvocationRequest, ProviderContext> getRequestContextMap() { return requestContextMap; } public Future<InvocationResponse> processRequest(final InvocationRequest request, final ProviderContext providerContext) { if (request.getCreateMillisTime() == 0) { request.setCreateMillisTime(System.currentTimeMillis()); } Future<InvocationResponse> invocationResponse = null; try { invocationResponse = doProcessRequest(request, providerContext); } catch (Throwable e) { String msg = "process request failed:" + request; if (request.getCallType() == Constants.CALLTYPE_REPLY && request.getMessageType() != Constants.MESSAGE_TYPE_HEART) { providerContext.getChannel().write(providerContext, ProviderUtils.createFailResponse(request, e)); } // logger.error(msg, e); } providerContext.setFuture(invocationResponse); return invocationResponse; } }