检测接口

This commit is contained in:
cheney 2022-08-16 10:05:49 +08:00
parent 640f3d2e41
commit 4b47c563ba
2 changed files with 80 additions and 63 deletions

View File

@ -2,10 +2,10 @@ package com.sunyard.sge.database;
import com.sunyard.SydApiException; import com.sunyard.SydApiException;
import com.sunyard.proto.Util; import com.sunyard.proto.Util;
import com.sunyard.sge.database.pool.HsmLinkInfo;
import com.sunyard.sge.log.LogFactory; import com.sunyard.sge.log.LogFactory;
import com.sunyard.util.SYMUtil; import com.sunyard.util.SYMUtil;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.codehaus.groovy.util.LockableObject;
import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
import java.util.Arrays; import java.util.Arrays;
@ -19,7 +19,9 @@ public class SydApi4Database implements SydApi {
static { static {
SydApi.SYD_SetLogConfig("./logs/", 0); SydApi.SYD_SetLogConfig("./logs/", 0);
} }
private SydApi4j[] hsms = null; private SydApi4j[] hsms = null;
private HsmLinkInfo[] linkInfos = null;
private boolean isShortLinkMode = false; private boolean isShortLinkMode = false;
@ -27,16 +29,19 @@ public class SydApi4Database implements SydApi {
isShortLinkMode = true; isShortLinkMode = true;
} }
public SydApi4Database(SydApi4j[] hsms) { public SydApi4Database(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) {
synchronized (this){
this.hsms = hsms; this.hsms = hsms;
} this.linkInfos = linkInfos;
} }
public SydApi4j[] getHsms() { public SydApi4j[] getHsms() {
return hsms; return hsms;
} }
public HsmLinkInfo[] getLinkInfos() {
return linkInfos;
}
@Override @Override
public SydApi SYD_Short_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int allDealTimeOut) { public SydApi SYD_Short_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int allDealTimeOut) {
Logger log = LogFactory.getLogger(); Logger log = LogFactory.getLogger();
@ -114,16 +119,29 @@ public class SydApi4Database implements SydApi {
} }
SydApiException le = null; SydApiException le = null;
//加锁
LockableObject lockableObject = new LockableObject();
lockableObject.lock();
try {
for (SydApi4j api : this.hsms) { for (SydApi4j api : this.hsms) {
if (null == api) { if (null == api) {
continue; continue;
} }
if (isShortLinkMode) {
try {
byte[] hash = api.SYD_SM3_LongData(pcData, null, 0);
log.debug("api.SYD_SM3_LongData方法返回值{}", Arrays.toString(hash));
return Util.bytes2HexString(hash);
} catch (SydApiException e) {
le = e;
if (e.getRetCode() < 0) {
log.error("HA 重试");
continue;
}
throw e;
}
} else {
synchronized (api) {
try { try {
byte[] hash = api.SYD_SM3_LongData(pcData, null, 0); byte[] hash = api.SYD_SM3_LongData(pcData, null, 0);
log.debug("api.SYD_SM3_LongData方法返回值{}", Arrays.toString(hash)); log.debug("api.SYD_SM3_LongData方法返回值{}", Arrays.toString(hash));
@ -138,13 +156,7 @@ public class SydApi4Database implements SydApi {
} }
} }
} }
catch (Exception e){
} }
finally {
lockableObject.unlock();
}
throw le; throw le;
} }

View File

@ -8,9 +8,6 @@ import com.sunyard.sge.pool.ThreadBasedConnectPool;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SydApiPool extends ThreadBasedConnectPool<SydApi> { public class SydApiPool extends ThreadBasedConnectPool<SydApi> {
static { static {
SydApi.SYD_SetLogConfig("./logs/", 0); SydApi.SYD_SetLogConfig("./logs/", 0);
@ -54,43 +51,51 @@ public class SydApiPool extends ThreadBasedConnectPool<SydApi> {
} }
return new SydApi4Database( apis ); return new SydApi4Database(apis, linkInfos);
} }
// 保活接口 // 保活接口
public boolean check(SydApi s) { public boolean check(SydApi s) {
if( !(s instanceof SydApi4Database) ) {
return false;
}
SydApi4Database o = (SydApi4Database) s; SydApi4Database o = (SydApi4Database) s;
Lock l = new ReentrantLock();
try { try {
l.lock();
SydApi4j[] hsms = o.getHsms(); SydApi4j[] hsms = o.getHsms();
boolean ifBoolean = false; boolean canUse = false;
int length = hsms.length; int length = hsms.length;
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
if (null != hsms[i]) { if (null != hsms[i]) {
try { try {
l.lock(); synchronized (hsms[i]) {
o.SYD_SM3_Hash_ShortData(new byte[8]); hsms[i].SYD_SM3_LongData(new byte[8], null, 0);
ifBoolean = true; canUse = true;
}
} catch (Exception e) { } catch (Exception e) {
// 忽略 // 忽略
hsms[i] = null; hsms[i] = null;
} }
finally { } else {
l.unlock(); // 尝试恢复连接
} HsmLinkInfo[] infos = o.getLinkInfos();
} HsmLinkInfo info = infos[i];
} try {
return ifBoolean; hsms[i] = (SydApi4j) new SydApi4j().connect(info.getPcIp(), info.getiPort(), null, info.getiConnectTimeOut(), info.getiDealTimeOut());
canUse = true;
} catch ( Exception e ) {
} }
catch (Exception e){ }
}
return canUse;
} catch (Exception e) {
return false; return false;
} }
finally {
l.unlock();
}
} }
// 释放 // 释放
protected void free(SydApi o) { protected void free(SydApi o) {
if (null != o) { if (null != o) {