package com.yiqiniu.easytrans; import java.io.Serializable; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import javax.annotation.Resource; import org.springframework.context.ApplicationContext; import com.yiqiniu.easytrans.executor.EasyTransExecutor; import com.yiqiniu.easytrans.protocol.EasyTransRequest; import com.yiqiniu.easytrans.util.ReflectUtil; public class EasyTransFacadeImpl implements EasyTransFacade{ @Resource private ApplicationContext ctx; private ConcurrentHashMap<Class<?>,EasyTransExecutor> mapExecutors = new ConcurrentHashMap<Class<?>, EasyTransExecutor>(); @Resource private EasyTransSynchronizer synchronizer; private EasyTransExecutor getExecutor(@SuppressWarnings("rawtypes") Class<? extends EasyTransRequest> clazz){ EasyTransExecutor easyTransExecutor = mapExecutors.get(clazz); if(easyTransExecutor == null){ Class<?> executorClazz = findEasyTransExecutor(clazz); easyTransExecutor = (EasyTransExecutor) ctx.getBean(executorClazz); mapExecutors.put(clazz,easyTransExecutor); } return easyTransExecutor; } @SuppressWarnings({ "unchecked", "rawtypes" }) private static Class<?> findEasyTransExecutor(Class clazz) { List<Class<?>> typeArguments = ReflectUtil.getTypeArguments(EasyTransRequest.class, clazz); if(typeArguments != null && typeArguments.size() >= 2){ return (Class<?>) typeArguments.get(1); }else{ return null; } } public void startEasyTrans(String busCode,String trxId){ synchronizer.startSoftTrans(busCode, trxId); } public <P extends EasyTransRequest<R,E>,E extends EasyTransExecutor, R extends Serializable> Future<R> execute(P params){ EasyTransExecutor e = getExecutor(params.getClass()); return e.execute(params); } }