package com.sunyard.sge.database.pool; import com.sunyard.SydApiException; import com.sunyard.sge.database.SydApi; import com.sunyard.sge.database.SydApi4Database; import com.sunyard.sge.database.SydApiBaseFunction; import com.sunyard.sge.log.LogFactory; import com.sunyard.sge.pool.ObjectInPool; import com.sunyard.sge.pool.ThreadBasedConnectPool; import org.apache.logging.log4j.Logger; import racal.sunyard.main.SydApi4j; public class SydApiPool extends ThreadBasedConnectPool { private HsmLinkInfo[] linkInfos; static { LogFactory.createLogger("./logs", 0); } public SydApiPool(HsmLinkInfo[] linkInfos) { super(); this.linkInfos = linkInfos; } // 继承 初始化 protected SydApi initialValue() { // 所有加密机一次性链接 SydApi4j[] apis = new SydApi4j[linkInfos.length]; // 只有所有都不好,才报错。 boolean connected = false; for (int i = 0; i < apis.length; i++) { HsmLinkInfo info = linkInfos[i]; try { apis[i] = (SydApi4j) new SydApi4j().connect(info.getPcIp(), info.getiPort(), null, info.getiConnectTimeOut(), info.getiDealTimeOut() ); connected = true; } catch (Exception e) { Logger log = LogFactory.getLogger(); // 忽略单个错误 log.error("网络连接错误 {} {} - 忽略", info.getPcIp(), info.getiPort()); } } if (!connected) { throw new SydApiException("连接错误", -1); } return new SydApiBaseFunction(apis, linkInfos); } // 保活接口 public boolean check(SydApi s) { if( !(s instanceof SydApi4Database) ) { return false; } SydApi4Database o = (SydApi4Database) s; try { SydApi4j[] hsms = o.getHsms(); boolean canUse = false; int length = hsms.length; for (int i = 0; i < length; i++) { if (null != hsms[i]) { try { synchronized (hsms[i]) { hsms[i].SYD_SM3_LongData(new byte[8], null, 0); canUse = true; } } catch (Exception e) { // 忽略 hsms[i] = null; } } else { // 尝试恢复连接 HsmLinkInfo[] infos = o.getLinkInfos(); HsmLinkInfo info = infos[i]; try { hsms[i] = (SydApi4j) new SydApi4j().connect(info.getPcIp(), info.getiPort(), null, info.getiConnectTimeOut(), info.getiDealTimeOut()); canUse = true; } catch ( Exception e ) { } } } return canUse; } catch (Exception e) { return false; } } // 释放 protected void free(SydApi o) { if (null != o) { if (o instanceof SydApi4Database) { ((SydApi4Database) o).SYD_Disconnect(); } } } protected void afterInit(ObjectInPool oip, SydApi value ){ if ( !( value instanceof SydApi4Database ) ) { return; } SydApi4Database api = (SydApi4Database) value; api.setOip( oip ); } }