线程池查询

package com.zte.intairsp.home.internal.service.common;

 

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

import bee.base.ioc.annotation.Inject;

import bee.base.ioc.annotation.ServiceLocator;

 

import com.amadeus.xml.satrsp_07_1_1a.Air_MultiAvailabilityReply;

import com.zte.etcpub.common.constant.ManagementBodyConstant;

import com.zte.etcpub.common.constant.TenantConstant;

import com.zte.intairsp.home.constant.IapCacheKey;

import com.zte.intairsp.home.constant.IapConstants;

import com.zte.intairsp.home.dao.IapDataCenter;

import com.zte.intairsp.home.data.bean.IapQueryAirInfoBean;

import com.zte.intairsp.home.data.bean.IntAirFlightBean;

import com.zte.intairsp.home.data.bean.IntAirFreightInfo;

import com.zte.intairsp.home.data.bean.IntAirInfoBean;

import com.zte.intairsp.home.data.bean.IntAirPassageBean;

import com.zte.intairsp.home.data.entity.IapAgencyPriceSet;

import com.zte.intairsp.home.data.entity.IapAirFlight;

import com.zte.intairsp.home.data.entity.IapFlightPcc;

import com.zte.intairsp.home.internal.service.inf.aslan.ws.FareInfo;

import com.zte.intairsp.home.internal.service.inf.espeed.ws.airinfo.AvailableJourney;

import com.zte.intairsp.home.internal.service.inf.gds.ws.avresponse.AirAvailability_Resp;

import com.zte.intairsp.home.internal.service.inf.gds.ws.fdresponse.AVFareInfo;

import com.zte.intairsp.home.service.IapServiceCenter;

import com.zte.intairsp.home.service.common.IapAirInfoService;

import com.zte.pub.common.client.BusinessClientInvoker;

import com.zte.pub.common.constant.SvrTypeConstants;

import com.zte.pub.common.data.bean.ContextInfo;

import com.zte.pub.common.exception.ExceptionFactory;

import com.zte.pub.common.util.BusinessUtils;

import com.zte.pub.common.util.EtcThreadPoolExecutor;

import com.zte.pub.common.util.EtcThreadPoolManager;

import com.zte.pub.common.util.besta.BusinessUtil;

import com.zte.pub.common.util.help.NullU;

import com.zte.pub.common.util.help.ObjectU;

import com.zte.zas.common.data.entity.FbpConfig;

import com.zte.zas.common.data.entity.FbpInvokeService;

import com.zte.zas.common.data.entity.FbpRate;

import com.zte.zas.common.data.entity.FbpVendor;

import com.zte.zas.common.service.ZasServiceCenter;

 

/**

 * 国际机票运价、航班查询服务

 * 

 * @author panqingbao

 * 

 */

public class IapAirInfoServiceImpl implements IapAirInfoService {

 

    private final Logger logger = LoggerFactory.getLogger(IapAirInfoServiceImpl.class);

    

    //static EtcThreadPoolExecutor executor = new EtcThreadPoolExecutor(100, 500, 0, TimeUnit.SECONDS,

    //        new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());

    

    //static EtcThreadPoolExecutor fdExecutor = new EtcThreadPoolExecutor(50, 200, 0, TimeUnit.SECONDS,

    //        new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());

 

    static EtcThreadPoolManager fdThreadPoolManager=new EtcThreadPoolManager(25);

    

    static EtcThreadPoolManager threadPoolManager=new EtcThreadPoolManager(50);

    

    static EtcThreadPoolManager amadeusAVThreadPoolManager=new EtcThreadPoolManager(50);

    

    

    @Inject

    private IapServiceCenter iapServiceCenter;

 

    @Inject

    private IapDataCenter iapDataCenter;

 

    @Inject

    @ServiceLocator(SvrTypeConstants.ST_OSGI)

    private ZasServiceCenter zasServiceCenter;

 

    @Inject

    @ServiceLocator(SvrTypeConstants.ST_OSGI)

    BusinessClientInvoker invoker;

 

    private final static String ENABLED_FLAG_Y = "Y";

    private final static String TARGET_CLENT_CLASS = "com.zte.intairsp.home.business.BusinessCenter4IntairSpThr";

    

    

    @Override

    public void findIntAirByFDAndAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode, 

            List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll,

            List<IapAirFlight> airFlights, String inlandFlag, FbpConfig commissionConfig, String gds, 

            HashMap<String, String> configs) throws Exception {

        if (IapConstants.INLAND_FLAG_I.equals(inlandFlag)){

            this.findIntAirByFDAndEspeedAV(context, param, vendorCode, agencyPriceList, dataListAll, airFlights, commissionConfig, configs);

        }

        else if (IapConstants.INLAND_FLAG_O.equals(inlandFlag)){

            if (IapConstants.BOOK_SYSTEM_1A.equals(gds)){

                this.findIntAirByFDAndAmadeusAV(context, param, vendorCode, agencyPriceList, dataListAll, airFlights, commissionConfig, configs);

            }

            else {

                this.findIntAirByFDAndGwsAV(context, param, vendorCode, agencyPriceList, dataListAll, airFlights, commissionConfig, configs);

            }

        }

    }

    

    @SuppressWarnings("static-access")

    private void findIntAirByFDAndEspeedAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,

            List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll, List<IapAirFlight> airFlights,

            FbpConfig commissionConfig, HashMap<String, String> configs)

            throws Exception {

        // FD、AV供应商CODE是GWS

        vendorCode = IapConstants.VENDOR_CODE_GWS;

        String aslanVendorCode = IapConstants.VENDOR_CODE_ASLAN;

        String espeedVendorCode = IapConstants.VENDOR_CODE_ESPEED;        

        // 取航线承运人配置

        List<String> airlineList = this.getFreightAirlineList(param, airFlights);

        if (!airlineList.isEmpty()) {

            //ESPEED AV

            boolean espeedAVFlag = false;

            List<AvailableJourney> availableJourneys = new ArrayList<AvailableJourney>();

            FbpInvokeService espeedInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FIND_FLIGHT, espeedVendorCode);

            QueryEspeedAVAirInfoThread espeedAvThread = new QueryEspeedAVAirInfoThread(context, param, espeedVendorCode, espeedInvokeService);

            espeedAvThread.start();

            

            //List<IntAirInfoBean> avDataList = new ArrayList<IntAirInfoBean>();

            List<IntAirInfoBean> aslanDataList = new ArrayList<IntAirInfoBean>();

            // 国际机票配置

            FbpConfig config = zasServiceCenter.getSysConfigService().findFbpConfigFromCache(IapConstants.INTAIR_DOM_FARE_CONFIG);

            boolean aslanFareFlag = false;

            boolean localFareFlag = false;

            if (config != null && NullU.isNotNull(config.getConfigValue())){

                Long managementBodyId = context.getManagementBodyId();

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_ASLAN)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_ASLAN))){

                    aslanFareFlag = true;

                }

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_LOCAL)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_LOCAL))){

                    localFareFlag = true;

                }

            }

            /*// AV

            boolean avGoFlag = false;

            boolean avReturnFlag = false;

            if (IapConstants.SINGLE.equals(param.getFlightType())) {

                avReturnFlag = true;

            }

            // 去程

            List<AirAvailability_Resp> goRespList = new ArrayList<AirAvailability_Resp>();

            IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

            FbpInvokeService avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AV, vendorCode);

            QueryAVAirInfoThreadPool avGoThread = new QueryAVAirInfoThreadPool(context, avGoParam, vendorCode,

                    airlineList, avInvokeService);

            avGoThread.start();

            // FD

            List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();

            boolean fdFlag = false;

            FbpInvokeService fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD, vendorCode);

            List<String> fDAirList = this.buildFDAirlineList(airlineList);

            QueryFDFareInfoThreadPool fdThread = new QueryFDFareInfoThreadPool(context, param, vendorCode,

                    fDAirList, airFlights, fdInvokeService);

            fdThread.start();*/

            // ASLAN FARE

            List<FareInfo> aslanFareInfos = new ArrayList<FareInfo>();

            boolean aslanFlag = false;

            FbpInvokeService aslanInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_ASLANSERVICE, aslanVendorCode);

            QueryAslanFareThread aslanThread = null;

            if (aslanInvokeService != null && aslanFareFlag){

                aslanThread = new QueryAslanFareThread(context, param, aslanVendorCode, aslanInvokeService);

                aslanThread.start();

            }

            /*// 回程

            List<AirAvailability_Resp> returnRespList = new ArrayList<AirAvailability_Resp>();

            if (IapConstants.RETURN.equals(param.getFlightType())) {

                // AV

                IapQueryAirInfoBean avReturnParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

                avReturnParam.setDeparture(param.getArrival());

                avReturnParam.setArrival(param.getDeparture());

                avReturnParam.setDepartureDate(param.getReturnDate());

                QueryAVAirInfoThreadPool avReturnThread = new QueryAVAirInfoThreadPool(context, avReturnParam,

                        vendorCode, airlineList, avInvokeService);

                avReturnThread.start();

                long startTime3 = new Date().getTime();

                // 实时查询运价信息。必须实时查询,不能放缓存,因为查询中有条件过滤。

                freightItems = iapServiceCenter.getIapFreightService().findIapFreightItemVs(context, param);

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime3) / 1000;

                    if (interval > 20) {

                        avReturnFlag = true;

                        break;

                    }

                    if (avReturnThread.isRunEnd()) {

                        returnRespList = avReturnThread.getRespList();

                        avReturnFlag = true;

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("线程查询回程AV错误:" + e.getMessage(), e);

                    }

                }

            }

            else {

                // 实时查询运价信息。必须实时查询,不能放缓存,因为查询中有条件过滤。

                freightItems = iapServiceCenter.getIapFreightService().findIapFreightItemVs(context, param);

            }

            long startTime2 = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime2) / 1000;

                if (interval > 20) {

                    avGoFlag = true;

                    break;

                }

                if (avGoThread.isRunEnd()) {

                    goRespList = avGoThread.getRespList();

                    avGoFlag = true;

                    break;

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                }

            }

            long startTime_FD = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime_FD) / 1000;

                if (interval > 20) {

                    fdFlag = true;

                    break;

                }

                if (fdThread.isRunEnd()) {

                    aVFareInfos = fdThread.getaVFareInfos();

                    fdFlag = true;

                    break;

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("线程查询去程FD错误:" + e.getMessage(), e);

                }

            }*/            

            if (aslanFareFlag){

                long startTime_ASLAN = new Date().getTime();

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime_ASLAN) / 1000;

                    if (interval > 50) {

                        aslanFlag = true;

                        break;

                    }

                    if (aslanThread.isRunEnd()) {

                        aslanFareInfos = aslanThread.getFareInfos();

                        aslanFlag = true;

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("线程查询去程ASLAN错误:" + e.getMessage(), e);

                    }

                }

            }

            long startTime_ESPEED = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime_ESPEED) / 1000;

                if (interval > 50) {

                    espeedAVFlag = true;

                    break;

                }

                if (espeedAvThread.isRunEnd()) {

                    availableJourneys = espeedAvThread.getAvailableJourneys();

                    espeedAVFlag = true;

                    break;

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("线程查询去程ESPEED AV错误:" + e.getMessage(), e);

                }

            }

            

            

            // 处理AV、ASLANFARE

            if (aslanFareFlag){

                long startTime5 = new Date().getTime();

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime5) / 1000;

                    if (interval > 80) {

                        break;

                    }

                    if (aslanFlag && espeedAVFlag) {

                        if (!aslanFareInfos.isEmpty()){

                            // 设置税费

                            setAslanFareTax(param, aslanFareInfos, airFlights);

                            String pcc = espeedInvokeService.getAttribute1(); //OFFICENO

                            aslanDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByEspeedAvAndAslan(aslanFareInfos, 

                                    availableJourneys, pcc, espeedVendorCode);

                        }

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("组装航班等待错误:" + e.getMessage(), e);

                    }

                }

                dataListAll.addAll(aslanDataList);

            }

            

            /*// 处理AV、FD

            long startTime4 = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime4) / 1000;

                if (interval > 30) {

                    break;

                }

                if (aslanFareFlag){

                    if (aslanFlag && fdFlag && avGoFlag && avReturnFlag) {

                        for (int i = aVFareInfos.size() - 1; i >=0; i--){

                            AVFareInfo aVFareInfo = aVFareInfos.get(i);

                            for (FareInfo fareInfo : aslanFareInfos){

                                if (aVFareInfo.getFIC().equals(fareInfo.getFarebasis())){

                                    aVFareInfos.remove(aVFareInfo);

                                }

                            }

                        }

                        String pcc = avInvokeService.getAttribute4();

                        avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,

                                returnRespList, pcc, vendorCode);

                        if (avDataList != null && avDataList.size() > 0 && avDataList.size() <= 500) {

                            

                        }

                        break;

                    }

                }

                else {

                    if (fdFlag && avGoFlag && avReturnFlag) {

                        avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,

                                returnRespList, pcc, vendorCode);

                        if (avDataList != null && avDataList.size() > 0 && avDataList.size() <= 500) {

                            

                        }

                        break;

                    }

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("组装航班等待错误:" + e.getMessage(), e);

                }

            }

            if (avDataList != null && avDataList.size() > 0) {

                iapServiceCenter.getIapCurrencyService().currencyConverter(context, avDataList, param);

                try {

                    iapServiceCenter.getIapAgencyService().reduceAgencyPrice(avDataList, agencyPriceList, param);

                } catch (RuntimeException e) {

                    logger.error("匹配并减去代理费错误:", e);

                }

            }   

            dataListAll.addAll(avDataList);*/

            

            // 实时查询运价信息。必须实时查询,不能放缓存,因为查询中有条件过滤。           

            if (localFareFlag){                

                try {

                    List<IntAirInfoBean> list = iapServiceCenter.getIapFreightSearchService().findLocalFreightByEspeed(context, param, agencyPriceList);

                    dataListAll.addAll(list);

                } catch (Exception e) {

                    logger.error("ESPEED FOR FREIGHT 查询本地运价出错:" + e.getMessage(), e);

                }

            }

        }        

    }    

    

 

    @SuppressWarnings("static-access")

    private void findIntAirByFDAndGwsAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode, 

            List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll,

            List<IapAirFlight> airFlights, FbpConfig commissionConfig, HashMap<String, String> configs) throws Exception {

        // FD、AV供应商CODE是GWS

        vendorCode = IapConstants.VENDOR_CODE_GWS;

        String aslanVendorCode = IapConstants.VENDOR_CODE_ASLAN;        

        // 取航线承运人配置

        List<String> airlineList = this.getFreightAirlineList(param, airFlights);

        if (!airlineList.isEmpty()) {

            List<IntAirInfoBean> avDataList = new ArrayList<IntAirInfoBean>();

            List<IntAirInfoBean> fdDataList = new ArrayList<IntAirInfoBean>();

            List<IntAirInfoBean> aslanDataList = new ArrayList<IntAirInfoBean>();

            // 国际机票配置

            FbpConfig config = zasServiceCenter.getSysConfigService().findFbpConfigFromCache(IapConstants.INTAIR_INT_FARE_CONFIG);

            boolean aslanFareFlag = false;

            boolean localFareFlag = false;

            boolean fdFareFlag = false;

            if (config != null && NullU.isNotNull(config.getConfigValue())){

                Long managementBodyId = context.getManagementBodyId();

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_ASLAN)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_ASLAN))){

                    aslanFareFlag = true;

                }

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_LOCAL)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_LOCAL))){

                    localFareFlag = true;

                }

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_FD)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_FD))){

                    fdFareFlag = true;

                }

            }

            // AV

            boolean avGoFlag = false;

            boolean avReturnFlag = false;

            if (IapConstants.SINGLE.equals(param.getFlightType())) {

                avReturnFlag = true;

            }

            // 去程

            List<AirAvailability_Resp> goRespList = new ArrayList<AirAvailability_Resp>();

            IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

            FbpInvokeService avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AV, vendorCode);

            String pcc = avInvokeService.getAttribute4();

            // 特殊PCC配置

            IapFlightPcc iapFlightPcc = iapServiceCenter.getIapCommonService().getFlightPcc(context, param, IapConstants.INTERFACE_TYPE_AV);

            if (iapFlightPcc != null){

                String p = iapFlightPcc.getPcc();

                if (NullU.isNotNull(p)){

                    avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AV + "_" + p, vendorCode);

                    pcc = p;

                }

            }

            QueryAVAirInfoThreadPool avGoThread = new QueryAVAirInfoThreadPool(context, avGoParam, vendorCode,

                    airlineList, avInvokeService);

            avGoThread.start();

            // FD

            List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();

            List<AVFareInfo> fDFareInfos = new ArrayList<AVFareInfo>();

            boolean fdFlag = false;

            FbpInvokeService fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD, vendorCode);

            if (iapFlightPcc != null){

                String p = iapFlightPcc.getPcc();

                if (NullU.isNotNull(p)){

                    fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD + "_" + p, vendorCode);

                    pcc = p;

                }

            }

            List<String> fDAirList = this.buildFDAirlineList(airlineList);

            FbpRate rate = zasServiceCenter.getFbpRateService().getRateByCurrencyFromCache(IapConstants.IAP_CURRENCY_HKD,

                    IapConstants.IAP_CURRENCY_CNY);

            QueryFDFareInfoThreadPool fdThread = new QueryFDFareInfoThreadPool(context, param, vendorCode,

                    fDAirList, airFlights, fdInvokeService, rate);

            fdThread.start();

            // ASLAN FARE

            List<FareInfo> aslanFareInfos = new ArrayList<FareInfo>();

            boolean aslanFlag = false;

            FbpInvokeService aslanInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_ASLANSERVICE, aslanVendorCode);

            QueryAslanFareThread aslanThread = null;

            if (aslanInvokeService != null && aslanFareFlag){

                aslanThread = new QueryAslanFareThread(context, param, aslanVendorCode, aslanInvokeService);

                aslanThread.start();

            }

            // 回程

            List<AirAvailability_Resp> returnRespList = new ArrayList<AirAvailability_Resp>();

            if (IapConstants.RETURN.equals(param.getFlightType())) {

                // AV

                IapQueryAirInfoBean avReturnParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

                avReturnParam.setDeparture(param.getArrival());

                avReturnParam.setArrival(param.getDeparture());

                avReturnParam.setDepartureDate(param.getReturnDate());

                QueryAVAirInfoThreadPool avReturnThread = new QueryAVAirInfoThreadPool(context, avReturnParam,

                        vendorCode, airlineList, avInvokeService);

                avReturnThread.start();

                long startTime3 = new Date().getTime();                

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime3) / 1000;

                    if (interval > 50) {

                        avReturnFlag = true;

                        break;

                    }

                    if (avReturnThread.isRunEnd()) {

                        returnRespList = avReturnThread.getRespList();

                        avReturnFlag = true;

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("线程查询回程AV错误:" + e.getMessage(), e);

                    }

                }

            }            

            long startTime2 = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime2) / 1000;

                if (interval > 50) {

                    avGoFlag = true;

                    break;

                }

                if (avGoThread.isRunEnd()) {

                    goRespList = avGoThread.getRespList();

                    avGoFlag = true;

                    break;

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                }

            }

            long startTime_FD = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime_FD) / 1000;

                if (interval > 50) {

                    fdFlag = true;

                    break;

                }

                if (fdThread.isRunEnd()) {

                    aVFareInfos = fdThread.getaVFareInfos();

                    fDFareInfos = aVFareInfos;

                    fdFlag = true;

                    break;

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("线程查询去程FD错误:" + e.getMessage(), e);

                }

            }

            if (aslanFareFlag){

                long startTime_ASLAN = new Date().getTime();

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime_ASLAN) / 1000;

                    if (interval > 50) {

                        aslanFlag = true;

                        break;

                    }

                    if (aslanThread.isRunEnd()) {

                        aslanFareInfos = aslanThread.getFareInfos();

                        aslanFlag = true;

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("线程查询去程ASLAN错误:" + e.getMessage(), e);

                    }

                }

            }

            

            

            // 处理AV、ASLANFARE

            if (aslanFareFlag){

                long startTime5 = new Date().getTime();

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime5) / 1000;

                    if (interval > 80) {

                        break;

                    }

                    if (aslanFlag && avGoFlag && avReturnFlag) {

                        if (!aslanFareInfos.isEmpty()){

                            // 设置税费

                            setAslanFareTax(param, aslanFareInfos, airFlights);

                            aslanDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAvAndAslan(aslanFareInfos, 

                                    goRespList, returnRespList, pcc, aslanVendorCode);

                        }

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("组装航班等待错误:" + e.getMessage(), e);

                    }

                }

                dataListAll.addAll(aslanDataList);

            }

            // 处理AV、FD

            long startTime4 = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime4) / 1000;

                if (interval > 80) {

                    break;

                }

                

                if (aslanFareFlag){

                    if (aslanFlag && fdFlag && avGoFlag && avReturnFlag) {

                        for (int i = aVFareInfos.size() - 1; i >=0; i--){

                            AVFareInfo aVFareInfo = aVFareInfos.get(i);

                            for (FareInfo fareInfo : aslanFareInfos){

                                if (aVFareInfo.getFIC().equals(fareInfo.getFarebasis())){

                                    aVFareInfos.remove(aVFareInfo);

                                }

                            }

                        }

                        avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,

                                returnRespList, pcc, vendorCode);

                        fdDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(fDFareInfos, goRespList,

                                returnRespList, pcc, vendorCode);

                        break;

                    }

                }

                else {

                    if (fdFlag && avGoFlag && avReturnFlag) {

                        avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,

                                returnRespList, pcc, vendorCode);

                        fdDataList = ObjectU.makeTargetList(avDataList, IntAirInfoBean.class);

                        break;

                    }

                }

                

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("组装航班等待错误:" + e.getMessage(), e);

                }

            }

            if (avDataList != null && avDataList.size() > 0) {

                // 汇率转换,代理费计算

                iapServiceCenter.getIapCurrencyService().currencyConverter(context, avDataList, param);

                try {

                    iapServiceCenter.getIapAgencyService().reduceAgencyPrice(avDataList, agencyPriceList, param);

                } catch (RuntimeException e) {

                    logger.error("匹配并减去代理费错误:", e);

                }

                

                // 后返处理

                try {

                    if (NullU.isNotNull(context.getManagementBodyId()) && commissionConfig != null && NullU.isNotNull(commissionConfig.getConfigValue())

                            && commissionConfig.getConfigValue().contains("," + context.getManagementBodyId() + ",")){

                        iapServiceCenter.getIapCommissionService().commissionProcess(context, avDataList);

                    }

                } catch (RuntimeException e) {

                    logger.error("后返处理错误:", e);

                }

            }  

            if (fdFareFlag && !avDataList.isEmpty()){

                dataListAll.addAll(avDataList);

            }

            if (localFareFlag){

                // 取FD运价航班匹配

                try {

                    List<IntAirInfoBean> list = iapServiceCenter.getIapFreightSearchService().findLocalFreightByGws(context, avGoParam, fdDataList, agencyPriceList);

                    dataListAll.addAll(list);

                } catch (Exception e) {

                    logger.error("GWS FOR FREIGHT 查询本地运价出错:"+e.getMessage(), e);

                }

            }

        }

    }

    

    @SuppressWarnings("static-access")

    private void findIntAirByFDAndAmadeusAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode, 

            List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll,

            List<IapAirFlight> airFlights, FbpConfig commissionConfig, HashMap<String, String> configs) throws Exception {

        // FD供应商CODE是GWS

        vendorCode = IapConstants.VENDOR_CODE_GWS;

        // AV供应商CODE是AMADEUS

        String amadeusVendorCode = IapConstants.VENDOR_CODE_AMADEUS;

        String aslanVendorCode = IapConstants.VENDOR_CODE_ASLAN;        

        // 取航线承运人配置

        List<String> airlineList = this.getFreightAirlineList(param, airFlights);

        if (!airlineList.isEmpty()) {

            List<IntAirInfoBean> avDataList = new ArrayList<IntAirInfoBean>();

            List<IntAirInfoBean> fdDataList = new ArrayList<IntAirInfoBean>();

            List<IntAirInfoBean> aslanDataList = new ArrayList<IntAirInfoBean>();

            // 国际机票配置

            FbpConfig config = zasServiceCenter.getSysConfigService().findFbpConfigFromCache(IapConstants.INTAIR_INT_FARE_CONFIG);

            boolean aslanFareFlag = false;

            boolean localFareFlag = false;

            boolean fdFareFlag = false;

            if (config != null && NullU.isNotNull(config.getConfigValue())){

                Long managementBodyId = context.getManagementBodyId();

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_ASLAN)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_ASLAN))){

                    aslanFareFlag = true;

                }

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_LOCAL)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_LOCAL))){

                    localFareFlag = true;

                }

                if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_FD)

                        && !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_FD))){

                    fdFareFlag = true;

                }

            }

            // AV

            boolean avGoFlag = false;

            boolean avReturnFlag = false;

            if (IapConstants.SINGLE.equals(param.getFlightType())) {

                avReturnFlag = true;

            }

            // 去程

            IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

            List<Air_MultiAvailabilityReply> goRespList = new ArrayList<Air_MultiAvailabilityReply>();

            IapQueryAirInfoBean avParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

            FbpInvokeService avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AMADEUS, amadeusVendorCode);

            String pcc = avInvokeService.getAttribute4();

            // Open Session

            //Session session = iapServiceCenter.getIapVendorInfService().openAmadeusSession(amadeusVendorCode, avInvokeService);

            //if (NullU.isNull(session)){

            //    return;

            //}

            List<String> avAirlineList = buildAmadeusAVAirlineList(airlineList);

            QueryAmadeusAVThreadPool avGoThread = new QueryAmadeusAVThreadPool(context, avParam,

                    amadeusVendorCode, avAirlineList, avInvokeService);

            avGoThread.start();

            

            // FD

            List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();

            List<AVFareInfo> fDFareInfos = new ArrayList<AVFareInfo>();

            boolean fdFlag = false;

            FbpInvokeService fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD, vendorCode);

            // 还是先用伽利略PCC

            //TODO

            pcc = fdInvokeService.getAttribute4();

            FbpRate rate = zasServiceCenter.getFbpRateService().getRateByCurrencyFromCache(IapConstants.IAP_CURRENCY_HKD,

                    IapConstants.IAP_CURRENCY_CNY);

            List<String> fDAirList = this.buildFDAirlineList(airlineList);

            QueryFDFareInfoThreadPool fdThread = new QueryFDFareInfoThreadPool(context, avGoParam, vendorCode,

                    fDAirList, airFlights, fdInvokeService, rate);

            fdThread.start();

            // ASLAN FARE

            List<FareInfo> aslanFareInfos = new ArrayList<FareInfo>();

            boolean aslanFlag = false;

            FbpInvokeService aslanInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_ASLANSERVICE, aslanVendorCode);

            QueryAslanFareThread aslanThread = null;

            if (aslanInvokeService != null && aslanFareFlag){

                aslanThread = new QueryAslanFareThread(context, param, aslanVendorCode, aslanInvokeService);

                aslanThread.start();

            }

            // 回程

            List<Air_MultiAvailabilityReply> returnRespList = new ArrayList<Air_MultiAvailabilityReply>();

            if (IapConstants.RETURN.equals(param.getFlightType())) {

                try {

                    Thread.currentThread().sleep(100);

                } catch (InterruptedException e) {

                    logger.error("线程查询回程AV 延迟100错误:" + e.getMessage(), e);

                }

                // Open Session

                /*Session returnSession = iapServiceCenter.getIapVendorInfService().openAmadeusSession(amadeusVendorCode, avInvokeService);

                if (NullU.isNull(returnSession)){

                    return;

                }*/

                // AV

                IapQueryAirInfoBean avReturnParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

                avReturnParam.setDeparture(param.getArrival());

                avReturnParam.setArrival(param.getDeparture());

                avReturnParam.setDepartureDate(param.getReturnDate());

                QueryAmadeusAVThreadPool avReturnThread = new QueryAmadeusAVThreadPool(context, avReturnParam,

                        amadeusVendorCode, avAirlineList, avInvokeService);

                avReturnThread.start();

                long startTime3 = new Date().getTime();                

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime3) / 1000;

                    if (interval > 50) {

                        avReturnFlag = true;

                        break;

                    }

                    if (avReturnThread.isRunEnd()) {

                        returnRespList = avReturnThread.getRespList();

                        avReturnFlag = true;

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("线程查询回程AV错误:" + e.getMessage(), e);

                    }

                }

                //iapServiceCenter.getIapVendorInfService().signOutAmadeusSession(amadeusVendorCode, avInvokeService, returnSession);

            }          

            long startTime2 = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime2) / 1000;

                if (interval > 50) {

                    avGoFlag = true;

                    break;

                }

                if (avGoThread.isRunEnd()) {

                    goRespList = avGoThread.getRespList();

                    avGoFlag = true;

                    break;

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                }

            }

            //iapServiceCenter.getIapVendorInfService().signOutAmadeusSession(amadeusVendorCode, avInvokeService, session);

            long startTime_FD = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime_FD) / 1000;

                if (interval > 50) {

                    fdFlag = true;

                    break;

                }

                if (fdThread.isRunEnd()) {

                    aVFareInfos = fdThread.getaVFareInfos();

                    fDFareInfos = aVFareInfos;

                    fdFlag = true;

                    break;

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("线程查询去程FD错误:" + e.getMessage(), e);

                }

            }

            if (aslanFareFlag){

                long startTime_ASLAN = new Date().getTime();

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime_ASLAN) / 1000;

                    if (interval > 50) {

                        aslanFlag = true;

                        break;

                    }

                    if (aslanThread.isRunEnd()) {

                        aslanFareInfos = aslanThread.getFareInfos();

                        aslanFlag = true;

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("线程查询去程ASLAN错误:" + e.getMessage(), e);

                    }

                }

            }

            

            // 处理AV、ASLANFARE

            if (aslanFareFlag){

                long startTime5 = new Date().getTime();

                while (true) {

                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                    long interval = (endTime - startTime5) / 1000;

                    if (interval > 80) {

                        break;

                    }

                    if (aslanFlag && avGoFlag && avReturnFlag) {

                        if (!aslanFareInfos.isEmpty()){

                            // 设置税费

                            setAslanFareTax(param, aslanFareInfos, airFlights);

                            aslanDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAvAndAslan(param, 

                                    aslanFareInfos, goRespList, returnRespList, pcc, aslanVendorCode);

                        }

                        break;

                    }

                    try {

                        Thread.currentThread().sleep(10);

                    } catch (InterruptedException e) {

                        logger.error("组装航班等待错误:" + e.getMessage(), e);

                    }

                }

                //dataListAll.addAll(aslanDataList);

            }

            // 处理AV、FD

            long startTime4 = new Date().getTime();

            while (true) {

                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                long interval = (endTime - startTime4) / 1000;

                if (interval > 80) {

                    break;

                }

                

                if (aslanFareFlag){

                    if (aslanFlag && fdFlag && avGoFlag && avReturnFlag) {

                        for (int i = aVFareInfos.size() - 1; i >=0; i--){

                            AVFareInfo aVFareInfo = aVFareInfos.get(i);

                            for (FareInfo fareInfo : aslanFareInfos){

                                if (aVFareInfo.getFIC().equals(fareInfo.getFarebasis())){

                                    aVFareInfos.remove(aVFareInfo);

                                }

                            }

                        }

                        avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAv(param, aVFareInfos,

                                goRespList, returnRespList, pcc, vendorCode);

                        fdDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAv(param, fDFareInfos,

                                goRespList, returnRespList, pcc, vendorCode);

                        break;

                    }

                }

                else {

                    if (fdFlag && avGoFlag && avReturnFlag) {

                        avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAv(param, aVFareInfos,

                                goRespList, returnRespList, pcc, vendorCode);

                        fdDataList = ObjectU.makeTargetList(avDataList, IntAirInfoBean.class);

                        break;

                    }

                }

                try {

                    Thread.currentThread().sleep(10);

                } catch (InterruptedException e) {

                    logger.error("组装航班等待错误:" + e.getMessage(), e);

                }

            }

            if (avDataList != null && avDataList.size() > 0) {

                // 汇率转换,代理费计算

                iapServiceCenter.getIapCurrencyService().currencyConverter(context, avDataList, param);

                try {

                    iapServiceCenter.getIapAgencyService().reduceAgencyPrice(avDataList, agencyPriceList, param);

                } catch (RuntimeException e) {

                    logger.error("匹配并减去代理费错误:", e);

                }

                

                // 后返处理

                try {

                    if (NullU.isNotNull(context.getManagementBodyId()) && commissionConfig != null && NullU.isNotNull(commissionConfig.getConfigValue())

                            && commissionConfig.getConfigValue().contains("," + context.getManagementBodyId() + ",")){

                        iapServiceCenter.getIapCommissionService().commissionProcess(context, avDataList);

                    }

                } catch (RuntimeException e) {

                    logger.error("后返处理错误:", e);

                }

            }  

            if (fdFareFlag && !avDataList.isEmpty()){

                dataListAll.addAll(avDataList);

            }

            if (localFareFlag){

                // 取FD运价航班匹配

                if (fdDataList != null && fdDataList.size() > 0) {                    

                    try {

                        List<IntAirInfoBean> list = iapServiceCenter.getIapFreightSearchService().findLocalFreightByGws(context, avParam, fdDataList, agencyPriceList);

                        dataListAll.addAll(list);

                    } catch (Exception e) {

                        logger.error("GWS FOR FREIGHT 查询本地运价出错:"+e.getMessage(), e);

                    }

                }

            }

        }

    }

 

    /**

     * 获取服务配置

     * @param serviceClass

     * @param vendorId

     * @return

     */

    private FbpInvokeService getServiceInfo(String serviceClass, String vendorCode) {

        List<FbpVendor> vendors = zasServiceCenter.getFbpVendorService().findAllNtTicketVendors();

        Long vendorId = null;

        for (FbpVendor vendor : vendors) {

            if (vendorCode.equals(vendor.getVendorCode())) {

                vendorId = vendor.getVendorId();

            }

        }  

        if (vendorId == null){

            throw new RuntimeException("找不到供应商信息:serviceClass=" + serviceClass);

        }

        FbpInvokeService result = zasServiceCenter.getIsmService().getVendorServiceInfo(vendorId, serviceClass);

        if (result == null) {

            throw new RuntimeException("找不到服务配置信息:serviceClass=" + serviceClass);

        }

        return result;

    }

    

    /**

     * 缓存航班

     * 

     * @param param

     * @return

     */

    private String getCacheKey(ContextInfo context, IapQueryAirInfoBean param, String vendorCode) {

        StringBuffer bf = new StringBuffer("INT_AFTERDEAL_").append(vendorCode).append("_");

        if (TenantConstant.TENANT_B2B_ID.compareTo(context.getTenantId()) == 0

                || ManagementBodyConstant.MANAGEMENTBODY_WSTB2B_ID.equals(context.getManagementBodyId())) {

            bf.append(context.getTenantId()); // 区分租户 用户区分普通用户加价和B2B加价

        }

        bf.append(param.getDeparture());

        bf.append("|");

        bf.append(param.getArrival());

        bf.append("|");

        bf.append(param.getDepartureDate());

        bf.append("|");

        bf.append("SINGLE".equals(param.getFlightType()) ? "" : param.getReturnDate());

        bf.append("|");

        bf.append(param.getCabin());

        bf.append("|");

        bf.append(param.getAirline() == null ? "" : param.getAirline());

        bf.append("|");

        bf.append(param.getPassengerCount());

        bf.append("|");

        bf.append(param.getTransferCount());

        return bf.toString();

    }

    

    /**

     * 多线程查询ASLAN FARE

     * 

     * @author panqingbao

     * 

     */

    class QueryAslanFareThread extends Thread {

 

        private ContextInfo context;

        private IapQueryAirInfoBean param;

        private String vendorCode;

        private FbpInvokeService aslanInvokeService;

        List<FareInfo> fareInfos;

        private boolean runEnd = false;

        private boolean used = false;

 

        QueryAslanFareThread(ContextInfo context, IapQueryAirInfoBean param, String vendorCode, FbpInvokeService aslanInvokeService) {

            this.context = context;

            this.param = param;

            this.vendorCode = vendorCode;

            this.aslanInvokeService = aslanInvokeService;

        }

 

        public void run() {

            runEnd = false;

            try {

                fareInfos = iapServiceCenter.getIapVendorInfService().findAslanFareInfo(context, param, vendorCode, aslanInvokeService);

            } catch (Exception ex) {

                logger.error("多线程查询ASLAN FARE错误,vendorCode=" + this.vendorCode, ex);

            } finally {

                runEnd = true;

            }

        }

 

        public List<FareInfo> getFareInfos() {

            return fareInfos;

        }

 

        public void setFareInfos(List<FareInfo> fareInfos) {

            this.fareInfos = fareInfos;

        }

 

        public ContextInfo getContext() {

            return context;

        }

 

        public void setContext(ContextInfo context) {

            this.context = context;

        }

 

        public String getVendorCode() {

            return vendorCode;

        }

 

        public void setVendorCode(String vendorCode) {

            this.vendorCode = vendorCode;

        }

 

        public FbpInvokeService getAslanInvokeService() {

            return aslanInvokeService;

        }

 

        public void setAslanInvokeService(FbpInvokeService aslanInvokeService) {

            this.aslanInvokeService = aslanInvokeService;

        }

 

        public boolean isRunEnd() {

            return runEnd;

        }

 

        public void setRunEnd(boolean runEnd) {

            this.runEnd = runEnd;

        }

 

        public boolean isUsed() {

            return used;

        }

 

        public void setUsed(boolean used) {

            this.used = used;

        }

 

        public IapQueryAirInfoBean getParam() {

            return param;

        }

 

        public void setParam(IapQueryAirInfoBean param) {

            this.param = param;

        }

    }

 

    /**

     * 多线程查询FD

     * 

     * @author panqingbao

     * 

     */

    class QueryFDFareInfoThreadPool extends Thread {

 

        private ContextInfo context;

        private IapQueryAirInfoBean param;

        private String vendorCode;

        private List<String> airlineList;

        private List<IapAirFlight> airFlights;

        private FbpInvokeService fdInvokeService;

        private FbpRate rate;

        final List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();

        private boolean runEnd = false;

        private boolean used = false;

 

        QueryFDFareInfoThreadPool(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,

                List<String> airlineList, List<IapAirFlight> airFlights, FbpInvokeService fdInvokeService, FbpRate rate) {

            this.context = context;

            this.param = param;

            this.vendorCode = vendorCode;

            this.airlineList = airlineList;

            this.airFlights = airFlights;

            this.fdInvokeService = fdInvokeService;

            this.rate = rate;

        }

 

        public void run() {

            Thread.currentThread().setName("intairsp-FD");

            runEnd = false;

            try {

                EtcThreadPoolExecutor fdExecutor = fdThreadPoolManager.requestThreadPool(10, 20, 0, TimeUnit.SECONDS,

                        new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());

                for (int i = 0; i < airlineList.size(); i++) {

                    String airline = airlineList.get(i);

                    final IapQueryAirInfoBean f_param = (IapQueryAirInfoBean) param.clone();

                    f_param.setAirline(airline);

                    fdExecutor.execute(new Runnable() {

                        @SuppressWarnings("static-access")

                        public void run() {

                            Thread.currentThread().setName("intairsp-FD-SUB");

                            try {

                                //List<AVFareInfo> dataList = iapServiceCenter.getIapVendorInfService().findFDAirInfo(f_context,

                                //        f_param, f_vendorCode);

                                List<AVFareInfo> dataList = new ArrayList<AVFareInfo>();

                                QueryFDAirInfoThread fDThread = new QueryFDAirInfoThread(context, f_param, vendorCode, fdInvokeService);

                                fDThread.start();

                                long startTime = new Date().getTime();

                                while (true) {

                                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                                    long interval = (endTime - startTime) / 1000;

                                    

                                    if (interval > 20) {

                                        fDThread = null;

                                        break;

                                    }

                                    if (fDThread.isRunEnd()) {

                                        //System.out.println(f_param.getAirline() + "==" + interval);

                                        dataList = fDThread.getDataList();;

                                        // 重设税费

                                        setFareTax(f_param, dataList, airFlights, rate);

                                        fDThread = null;

                                        break;

                                    }

                                    try {

                                        Thread.currentThread().sleep(10);

                                    } catch (InterruptedException e) {

                                        logger.error("线程查询FD错误:" + e.getMessage(), e);

                                    }

                                }

                                aVFareInfos.addAll(dataList);

                            } catch (Exception ex) {

                                logger.error("多线程查询FD错误,vendorCode=" + vendorCode, ex);

                            }

                        }

                    });

                }

                // 等待线程池处理完毕

                fdExecutor.isEndTask();

            } catch (Exception ex) {

                logger.error("多线程查询FD错误,vendorCode=" + this.vendorCode, ex);

            } finally {

                runEnd = true;

            }

        }

    

        public List<AVFareInfo> getaVFareInfos() {

            return aVFareInfos;

        }

 

        public ContextInfo getContext() {

            return context;

        }

    

        public void setContext(ContextInfo context) {

            this.context = context;

        }

    

        public String getVendorCode() {

            return vendorCode;

        }

    

        public void setVendorCode(String vendorCode) {

            this.vendorCode = vendorCode;

        }

    

        public boolean isRunEnd() {

            return runEnd;

        }

    

        public void setRunEnd(boolean runEnd) {

            this.runEnd = runEnd;

        }

    

        public boolean isUsed() {

            return used;

        }

    

        public void setUsed(boolean used) {

            this.used = used;

        }

    

        public IapQueryAirInfoBean getParam() {

            return param;

        }

    

        public void setParam(IapQueryAirInfoBean param) {

            this.param = param;

        }

    

        public List<String> getAirlineList() {

            return airlineList;

        }

    

        public void setAirlineList(List<String> airlineList) {

            this.airlineList = airlineList;

        }

 

        public FbpInvokeService getFdInvokeService() {

            return fdInvokeService;

        }

 

        public void setFdInvokeService(FbpInvokeService fdInvokeService) {

            this.fdInvokeService = fdInvokeService;

        }

 

        public List<IapAirFlight> getAirFlights() {

            return airFlights;

        }

 

        public void setAirFlights(List<IapAirFlight> airFlights) {

            this.airFlights = airFlights;

        }

 

        public FbpRate getRate() {

            return rate;

        }

 

        public void setRate(FbpRate rate) {

            this.rate = rate;

        }

        

    }

    

    /**

     * Amadeus AV airline 

     * @param airlineList

     * @return

     */

    private List<String> buildAmadeusAVAirlineList(List<String> airlineList){

        List<String> airlines = new ArrayList<String>();

        for (int i = 0; i < airlineList.size();) {

            StringBuffer air = new StringBuffer();

            int k = i;

            for (int j = i; j < airlineList.size(); j++) {

                if (j - k < 6) {

                    air.append(airlineList.get(j) + ",");

                } else {

                    i = j;

                    break;

                }

                i = j + 1;

            }

            String airLine = air.toString();

            airLine = airLine.substring(0, airLine.length() - 1);

            airlines.add(airLine);

        }

        return airlines;

    }

    

    private List<String> buildFDAirlineList(List<String> airlineList){

        // 三个承运人一组取FD运价

        List<String> fDAirList = new ArrayList<String>();

        for (int i = 0; i < airlineList.size();) {

            StringBuffer air = new StringBuffer();

            int k = i;

            for (int j = i; j < airlineList.size(); j++) {

                if (j - k < 3) {

                    air.append(airlineList.get(j) + ",");

                } else {

                    i = j;

                    break;

                }

                i = j + 1;

            }

            String airLine = air.toString();

            airLine = airLine.substring(0, airLine.length() - 1);

            fDAirList.add(airLine);

        }

        return fDAirList;

    }

    

    private void setFareTax(IapQueryAirInfoBean f_param, List<AVFareInfo> dataList, List<IapAirFlight> airFlights, FbpRate rate){

        try {

            for (AVFareInfo fareInfo : dataList){

                for (IapAirFlight airFlight : airFlights){

                    if (fareInfo.getFlightType().equals(airFlight.getFlightType())){

                        if (f_param.getDeparture().equals(airFlight.getFromCity())

                                && f_param.getArrival().equals(airFlight.getToCity())

                                && fareInfo.getAirV().equals(airFlight.getGoAirline())

                                && fareInfo.getAirV().equals(airFlight.getReturnAirline())

                                && String.valueOf(f_param.getTransferCount()).equals(String.valueOf(airFlight.getTransferCount()))){

                            

                            if (IapConstants.IAP_CURRENCY_HKD.equals(airFlight.getCurrency())){

                                fareInfo.setEstTax(String.valueOf(airFlight.getTax()));

                                fareInfo.setQ(String.valueOf(airFlight.getQ()));

                                break;

                            }

                            else if (IapConstants.IAP_CURRENCY_CNY.equals(airFlight.getCurrency())){

                                if (NullU.isNotNull(rate) && NullU.isNotNull(rate.getSellPrice())) {

                                    Double sellPrice = rate.getSellPrice();

                                    sellPrice = 1 / sellPrice;

                                    String taxStr = this.getCNYAmount(String.valueOf(airFlight.getTax()), sellPrice);

                                    String qStr = this.getCNYAmount(String.valueOf(airFlight.getQ()), sellPrice);

                                    fareInfo.setEstTax(taxStr);

                                    fareInfo.setQ(qStr);

                                    break;

                                }

                            }

                        }

                    }

                }

            }

        }

        catch (Exception ex) {

            logger.error("设置FD运价税费错误 ", ex);

        }

    }

    

    private void setAslanFareTax(IapQueryAirInfoBean f_param, List<FareInfo> dataList, List<IapAirFlight> airFlights){

        try {

            for (FareInfo fareInfo : dataList){

                fareInfo.setTax(fareInfo.getAdultTax());//赋值ASLAN预估税

                for (IapAirFlight airFlight : airFlights){

                    String flightType = fareInfo.getTravelType();

                    if (IapConstants.RETURN_ZHS.equals(flightType)){

                        flightType = IapConstants.RETURN;

                        if (flightType.equals(airFlight.getFlightType())){

                            if (f_param.getDeparture().equals(airFlight.getFromCity())

                                    && f_param.getArrival().equals(airFlight.getToCity())

                                    && fareInfo.getAirline().equals(airFlight.getGoAirline())

                                    && fareInfo.getAirline().equals(airFlight.getReturnAirline())

                                    && String.valueOf(f_param.getTransferCount()).equals(String.valueOf(airFlight.getTransferCount()))){

                                

                                if (NullU.isNotNull(fareInfo.getAdultTax())){

                                    fareInfo.setTax(fareInfo.getAdultTax());

                                    fareInfo.setQ("0");

                                }

                                else if (IapConstants.IAP_CURRENCY_CNY.equals(airFlight.getCurrency())

                                    && airFlight.getTax() != null && airFlight.getTax().compareTo(0D) > 0){

                                    fareInfo.setTax(String.valueOf(airFlight.getTax()));

                                    fareInfo.setQ(String.valueOf(airFlight.getQ()));

                                }

                                break;

                            }

                        }

                    }

                    else if (IapConstants.SINGLE_ZHS.equals(flightType)){

                        flightType = IapConstants.SINGLE;

                        if (flightType.equals(airFlight.getFlightType())){

                            if (f_param.getDeparture().equals(airFlight.getFromCity())

                                    && f_param.getArrival().equals(airFlight.getToCity())

                                    && fareInfo.getAirline().equals(airFlight.getGoAirline())

                                    && String.valueOf(f_param.getTransferCount()).equals(String.valueOf(airFlight.getTransferCount()))){

                                

                                if (NullU.isNotNull(fareInfo.getAdultTax())){

                                    fareInfo.setTax(fareInfo.getAdultTax());

                                    fareInfo.setQ("0");

                                }

                                else if (IapConstants.IAP_CURRENCY_CNY.equals(airFlight.getCurrency())

                                    && airFlight.getTax() != null && airFlight.getTax().compareTo(0D) > 0){

                                    fareInfo.setTax(String.valueOf(airFlight.getTax()));

                                    fareInfo.setQ(String.valueOf(airFlight.getQ()));

                                }

                                break;

                            }

                        }

                    }

                    

                }

            }

        }

        catch (Exception ex) {

            logger.error("设置ASLAN运价税费错误 ", ex);

        }

    }

    

    /**

     * 得到转换后的金额,并去掉小数点

     * 

     * @param amount

     * @param sellPrice

     * @return

     */

    private String getCNYAmount(String amount, Double sellPrice) {

        double cnyAmount = Double.parseDouble(amount) * sellPrice;

        String cnyAmountStr = String.valueOf(cnyAmount);

        if (cnyAmountStr != null && cnyAmountStr.contains(".")) {

            return cnyAmountStr.substring(0, cnyAmountStr.indexOf("."));

        }

        return cnyAmountStr;

    }

 

    /**

     * 多线程查询AV

     * 

     * @author panqingbao

     * 

     */

    class QueryAVAirInfoThreadPool extends Thread {

 

        private ContextInfo context;

        private IapQueryAirInfoBean param;

        private String vendorCode;

        private List<String> airlineList;

        private FbpInvokeService avInvokeService;

        private List<AirAvailability_Resp> respList = new ArrayList<AirAvailability_Resp>();

        private boolean runEnd = false;

        private boolean used = false;

 

        QueryAVAirInfoThreadPool(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,

                List<String> airlineList, FbpInvokeService avInvokeService) {

            this.context = context;

            this.param = param;

            this.vendorCode = vendorCode;

            this.airlineList = airlineList;

            this.avInvokeService = avInvokeService;

        }

        

        public void run() {

            Thread.currentThread().setName("intairsp-AV");

            runEnd = false;

            try {

                EtcThreadPoolExecutor executor = threadPoolManager.requestThreadPool(20, 50, 0, TimeUnit.SECONDS,

                        new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());

                for (int i = 0; i < airlineList.size(); i++) {

                    final String airline = airlineList.get(i);

                    executor.execute(new Runnable() {

                        @SuppressWarnings("static-access")

                        public void run() {

                            Thread.currentThread().setName("intairsp-AV-SUB");

                            try {

                                AirAvailability_Resp resp = new AirAvailability_Resp();

                                IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);

                                QueryAVAirInfoThread avGoThread = new QueryAVAirInfoThread(context, avGoParam,

                                        vendorCode, airline, avInvokeService);

                                long startTime2 = new Date().getTime();

                                avGoThread.start();

                                while (true) {

                                    long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                                    long interval = (endTime - startTime2) / 1000;

                                    if (interval > 20) {

                                        avGoThread = null;

                                        //System.out.println("AV break====" + (endTime - startTime2));

                                        break;

                                    }

                                    if (avGoThread.isRunEnd()) {

                                        //System.out.println("AV====" + avGoParam.getDeparture() + "==" + airline + "===" + (endTime - startTime2));

                                        resp = avGoThread.getResp();

                                        avGoThread = null;

                                        respList.add(resp);

                                        break;

                                    }

                                    try {

                                        Thread.currentThread().sleep(10);

                                    } catch (InterruptedException e) {

                                        logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                                    }

                                }

                                // 更多去程航班

                                if (BusinessUtils.isNotNull(resp) && BusinessUtils.isNotNull(resp.getAirAvail())

                                        && NullU.isNull(resp.getAirAvail().getErrorCode())

                                        && BusinessUtils.isNotNull(resp.getAirAvail().getMoreToken())

                                        && BusinessUtils.isNotNull(resp.getAirAvail().getMoreToken().getTok())) {

                                    AirAvailability_Resp moreResp = new AirAvailability_Resp();

                                    IapQueryAirInfoBean avMoreGoParam = ObjectU

                                            .copyAs(param, IapQueryAirInfoBean.class);

                                    avMoreGoParam.setTok(resp.getAirAvail().getMoreToken().getTok());

                                    QueryAVAirInfoThread avMoreGoThread = new QueryAVAirInfoThread(context,

                                            avMoreGoParam, vendorCode, airline, avInvokeService);

                                    avMoreGoThread.start();

                                    long startTimeMore2 = new Date().getTime();

                                    while (true) {

                                        long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                                        long interval = (endTime - startTimeMore2) / 1000;

                                        if (interval > 20) {

                                            avMoreGoThread = null;

                                            break;

                                        }

                                        if (avMoreGoThread.isRunEnd()) {

                                            //System.out.println("AVmore====" + avGoParam.getDeparture() + "==" + airline + "===" + (endTime - startTimeMore2));

                                            moreResp = avMoreGoThread.getResp();

                                            avMoreGoThread = null;

                                            break;

                                        }

                                        try {

                                            Thread.currentThread().sleep(10);

                                        } catch (InterruptedException e) {

                                            logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                                        }

                                    }

                                    if (moreResp != null) {

                                        resp.setMoreResp(moreResp);

                                        // 再多去程航班

                                        if (BusinessUtils.isNotNull(moreResp)

                                                && BusinessUtils.isNotNull(moreResp.getAirAvail())

                                                && NullU.isNull(moreResp.getAirAvail().getErrorCode())

                                                && BusinessUtils.isNotNull(moreResp.getAirAvail().getMoreToken())

                                                && BusinessUtils.isNotNull(moreResp.getAirAvail().getMoreToken()

                                                        .getTok())) {

                                            AirAvailability_Resp moreResp3 = new AirAvailability_Resp();

                                            IapQueryAirInfoBean avMoreGoParam3 = ObjectU.copyAs(param,

                                                    IapQueryAirInfoBean.class);

                                            avMoreGoParam3.setTok(moreResp.getAirAvail().getMoreToken().getTok());

                                            QueryAVAirInfoThread avMoreGoThread3 = new QueryAVAirInfoThread(context,

                                                    avMoreGoParam3, vendorCode, airline, avInvokeService);

                                            avMoreGoThread3.start();

                                            long startTimeMore3 = new Date().getTime();

                                            while (true) {

                                                long endTime = java.util.Calendar.getInstance().getTimeInMillis();

                                                long interval = (endTime - startTimeMore3) / 1000;

                                                if (interval > 20) {

                                                    avMoreGoThread3 = null;

                                                    break;

                                                }

                                                if (avMoreGoThread3.isRunEnd()) {

                                                    moreResp3 = avMoreGoThread3.getResp();

                                                    avMoreGoThread3 = null;

                                                    break;

                                                }

                                                try {

                                                    Thread.currentThread().sleep(10);

                                                } catch (InterruptedException e) {

                                                    logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                                                }

                                            }

                                            if (moreResp3 != null) {

                                                moreResp.setMoreResp(moreResp3);

                                                // 4层去程航班

                                                if (BusinessUtils.isNotNull(moreResp3)

                                                        && BusinessUtils.isNotNull(moreResp3.getAirAvail())

                                                        && NullU.isNull(moreResp3.getAirAvail().getErrorCode())

                                                        && BusinessUtils.isNotNull(moreResp3.getAirAvail()

                                                                .getMoreToken())

                                                        && BusinessUtils.isNotNull(moreResp3.getAirAvail()

                                                                .getMoreToken().getTok())) {

                                                    AirAvailability_Resp moreResp4 = new AirAvailability_Resp();

                                                    IapQueryAirInfoBean avMoreGoParam4 = ObjectU.copyAs(param,

                                                            IapQueryAirInfoBean.class);

                                                    avMoreGoParam4.setTok(moreResp3.getAirAvail().getMoreToken()

                                                            .getTok());

                                                    QueryAVAirInfoThread avMoreGoThread4 = new QueryAVAirInfoThread(

                                                            context, avMoreGoParam4, vendorCode, airline, avInvokeService);

                                                    avMoreGoThread4.start();

                                                    long startTimeMore4 = new Date().getTime();

                                                    while (true) {

                                                        long endTime = java.util.Calendar.getInstance()

                                                                .getTimeInMillis();

                                                        long interval = (endTime - startTimeMore4) / 1000;

                                                        if (interval > 20) {

                                                            avMoreGoThread4 = null;

                                                            break;

                                                        }

                                                        if (avMoreGoThread4.isRunEnd()) {

                                                            moreResp4 = avMoreGoThread4.getResp();

                                                            avMoreGoThread4 = null;

                                                            break;

                                                        }

                                                        try {

                                                            Thread.currentThread().sleep(10);

                                                        } catch (InterruptedException e) {

                                                            logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                                                        }

                                                    }

                                                    if (moreResp4 != null) {

                                                        moreResp3.setMoreResp(moreResp4);

                                                        // 5层去程航班

                                                        if (BusinessUtils.isNotNull(moreResp4)

                                                                && BusinessUtils.isNotNull(moreResp4.getAirAvail())

                                                                && NullU.isNull(moreResp4.getAirAvail().getErrorCode())

                                                                && BusinessUtils.isNotNull(moreResp4.getAirAvail()

                                                                        .getMoreToken())

                                                                && BusinessUtils.isNotNull(moreResp4.getAirAvail()

                                                                        .getMoreToken().getTok())) {

                                                            AirAvailability_Resp moreResp5 = new AirAvailability_Resp();

                                                            IapQueryAirInfoBean avMoreGoParam5 = ObjectU.copyAs(param,

                                                                    IapQueryAirInfoBean.class);

                                                            avMoreGoParam5.setTok(moreResp4.getAirAvail()

                                                                    .getMoreToken().getTok());

                                                            QueryAVAirInfoThread avMoreGoThread5 = new QueryAVAirInfoThread(

                                                                    context, avMoreGoParam5, vendorCode, airline, avInvokeService);

                                                            avMoreGoThread5.start();

                                                            long startTimeMore5 = new Date().getTime();

                                                            while (true) {

                                                                long endTime = java.util.Calendar.getInstance()

                                                                        .getTimeInMillis();

                                                                long interval = (endTime - startTimeMore5) / 1000;

                                                                if (interval > 20) {

                                                                    avMoreGoThread5 = null;

                                                                    break;

                                                                }

                                                                if (avMoreGoThread5.isRunEnd()) {

                                                                    moreResp5 = avMoreGoThread5.getResp();

                                                                    avMoreGoThread5 = null;

                                                                    break;

                                                                }

                                                                try {

                                                                    Thread.currentThread().sleep(10);

                                                                } catch (InterruptedException e) {

                                                                    logger.error("线程查询去程AV错误:" + e.getMessage(), e);

                                                                }

                                                            }

                                                            if (moreResp5 != null) {

                                                                moreResp4.setMoreResp(moreResp5);

                                                            }

                                                        }

                                                    }

                                                }

                                            }

                                        }

                                    }

                                }

                            } catch (Exception ex) {

                                logger.error("多线程查询AV错误,vendorCode=" + vendorCode, ex);

                            }

                        }

                    });

                }

                // 等待线程池处理完毕

                executor.isEndTask();

            } catch (Exception ex) {

                logger.error("多线程查询AV错误,vendorCode=" + this.vendorCode, ex);

            } finally {

                runEnd = true;

            }

        }

 

        public List<AirAvailability_Resp> getRespList() {

            return respList;

        }

 

        public void setRespList(List<AirAvailability_Resp> respList) {

            this.respList = respList;

        }

 

        public ContextInfo getContext() {

            return context;

        }

 

        public void setContext(ContextInfo context) {

            this.context = context;

        }

 

        public String getVendorCode() {

            return vendorCode;

        }

 

        public void setVendorCode(String vendorCode) {

            this.vendorCode = vendorCode;

        }

 

        public boolean isRunEnd() {

            return runEnd;

        }

 

        public void setRunEnd(boolean runEnd) {

            this.runEnd = runEnd;

        }

 

        public boolean isUsed() {

            return used;

        }

 

        public void setUsed(boolean used) {

            this.used = used;

        }

 

        public IapQueryAirInfoBean getParam() {

            return param;

        }

 

        public void setParam(IapQueryAirInfoBean param) {

            this.param = param;

        }

 

        public List<String> getAirlineList() {

            return airlineList;

        }

 

        public void setAirlineList(List<String> airlineList) {

            this.airlineList = airlineList;

        }

 

        public FbpInvokeService getAvInvokeService() {

            return avInvokeService;

        }

 

        public void setAvInvokeService(FbpInvokeService avInvokeService) {

            this.avInvokeService = avInvokeService;

        }

    }

   

 

 

你可能感兴趣的:(线程池)