118 lines
3.5 KiB
Java
118 lines
3.5 KiB
Java
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<SydApi> {
|
|
|
|
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 );
|
|
}
|
|
|
|
}
|