From b32d2d7c402f5758b89d5136b71a21365c0b8d9b Mon Sep 17 00:00:00 2001 From: cheney Date: Wed, 7 Sep 2022 20:11:03 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=B9=B6=E8=A1=8C=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sunyard/sge/database/SydApi4Database.java | 822 ++---------------- .../sunyard/sge/database/SydApi4Function.java | 789 +++++++++++++++++ .../com/sunyard/sge/database/SydApiSM4.java | 2 +- .../java/com/sunyard/sge/pool/CommWorker.java | 42 + .../java/com/sunyard/sge/pool/PoolConfig.java | 26 +- .../sge/pool/ThreadBasedConnectPool.java | 31 +- src/test/java/sample/ShortLinkSample.java | 5 +- src/test/java/test/BatchDataTest.java | 73 ++ src/test/java/test/FutureTaskTest.java | 66 ++ src/test/java/test/Test.java | 11 +- 10 files changed, 1099 insertions(+), 768 deletions(-) create mode 100644 src/main/java/com/sunyard/sge/database/SydApi4Function.java create mode 100644 src/main/java/com/sunyard/sge/pool/CommWorker.java create mode 100644 src/test/java/test/BatchDataTest.java create mode 100644 src/test/java/test/FutureTaskTest.java diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index 221b63b..1d5dc00 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -1,789 +1,117 @@ package com.sunyard.sge.database; import com.sunyard.SydApiException; -import com.sunyard.proto.Util; import com.sunyard.sge.database.pool.HsmLinkInfo; -import com.sunyard.sge.log.LogFactory; -import com.sunyard.sge.pool.ObjectInPool; -import com.sunyard.util.SYMUtil; -import org.apache.logging.log4j.Logger; +import com.sunyard.sge.pool.CommWorker; import racal.sunyard.main.SydApi4j; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; -/** - * 上海黄金交易所 - 数据库加密方案 - */ -public class SydApi4Database implements SydApi { - - static { - SydApi.SYD_SetLogConfig("./logs/", 0); - } - - private SydApi4j[] hsms = null; - private HsmLinkInfo[] linkInfos = null; - private ObjectInPool oip = null; - - private boolean isShortLinkMode = false; +public class SydApi4Database extends SydApi4Function { + private static final int BATCH_SIZE = 7680; + private static final CommWorker longLinkWorks = new CommWorker(); public SydApi4Database() { - isShortLinkMode = true; + super(); } public SydApi4Database(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) { - this.hsms = hsms; - this.linkInfos = linkInfos; + super(hsms, linkInfos); } - public SydApi4j[] getHsms() { - return hsms; - } - public HsmLinkInfo[] getLinkInfos() { - return linkInfos; - } - - public void setOip(ObjectInPool oip) { - this.oip = oip; - } - - private void updateLastUseTime(){ - if ( null != this.oip ) { - this.oip.updateLastUseTime(); - } - } - - @Override - public SydApi SYD_Short_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int allDealTimeOut) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_Connect_Ex方法接收参数:pcIpList:{},iPortList:{},iConnectTimeOut:{},iDealTimeOut:{}", Arrays.toString(pcIpList), Arrays.toString(iPortList), iConnectTimeOut, allDealTimeOut); - } - - if (pcIpList.length != iPortList.length) { - throw new IllegalArgumentException("ip与端口数量不一致"); - } - SydApi4j[] apis = new SydApi4j[pcIpList.length]; - int iDealTimeOut = allDealTimeOut / pcIpList.length; - boolean connected = false; - for (int i = 0; i < pcIpList.length; i++) { - - try { - - apis[i] = (SydApi4j) new SydApi4j().connect(pcIpList[i], iPortList[i], null, iConnectTimeOut, iDealTimeOut); - connected = true; - } catch (Exception e) { - // 忽略错误 - log.error("网络连接错误 {} {} - 忽略", pcIpList[i], iPortList[i]); - } - - } - if (!connected) { - // TODO - throw new SydApiException("连接错误", -1); - } - - - hsms = apis; - isShortLinkMode = true; - return this; - } - - public void SYD_Disconnect() { - if (null == hsms) { - return; - } - try { - for (int i = 0; i < hsms.length; i++) { - SydApi4j api = hsms[i]; - if (null != api) { - try { - api.disconnect(); - } catch (Exception e) { - - } - } - } - } catch (Exception e) { - - } - hsms = null; - } - - @Override - public void SYD_Disconnect_Ex() { - - if (isShortLinkMode) { - SYD_Disconnect(); - } - - // 配合链接池,不再需要释放。 - } - - @Override - public String SYD_SM3_Hash_ShortData(byte[] pcData) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM3_Hash_ShortData方法接收参数:pcData:{}", Arrays.toString(pcData)); - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - SydApiException le = new SydApiException(-1); - - updateLastUseTime(); - for (SydApi4j api : this.hsms) { - - if (null == api) { - 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 { - 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; - } - } - } - } - throw le; - } - - @Override - public LongDataReturn SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM3_Hash_LongData方法接收参数:pcData:{},iPkgNum:{},pcProcData:{}", Arrays.toString(pcData), iPkgNum, pcProcData); - } - - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - byte[] procData = null; - if (2 == iPkgNum || 3 == iPkgNum) { - procData = Util.hexString2Bytes(pcProcData); - log.debug("Util.hexString2Bytes方法返回值:{}", Arrays.toString(procData)); - - } - - SydApiException le = new SydApiException(-1); - updateLastUseTime(); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - byte[] hash = api.SYD_SM3_LongData(pcData, procData, iPkgNum); - log.debug("api.SYD_SM3_LongData方法返回值:{}", Arrays.toString(hash)); - if (0 == iPkgNum || 3 == iPkgNum) { - return new LongDataReturn(null, Util.bytes2HexString(hash)); - } else { - return new LongDataReturn(Util.bytes2HexString(hash), null); - } - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } else { - synchronized (api) { - try { - byte[] hash = api.SYD_SM3_LongData(pcData, procData, iPkgNum); - log.debug("api.SYD_SM3_LongData方法返回值:{}", Arrays.toString(hash)); - if (0 == iPkgNum || 3 == iPkgNum) { - return new LongDataReturn(null, Util.bytes2HexString(hash)); - } else { - return new LongDataReturn(Util.bytes2HexString(hash), null); - } - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - - throw le; - } - - @Override - public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4_ShortData方法接收参数:iKeyIndex:{},pcData:{},iFlag:{}", iKeyIndex, Arrays.toString(pcData), iFlag); - } - if (iFlag == Consts.ECB_DEC && null == pcData || pcData.length == 0) { - throw new SydApiException(19); - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - - updateLastUseTime(); - String keyIndex = String.format("%08d", iKeyIndex); - SydApiException le = new SydApiException(-1); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - if (Consts.ECB_ENC == iFlag) { - return api.SYMEncryptData( - com.sunyard.SydApi.NALG_SM4, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData); - } else { - return api.SYMDecryptData( - com.sunyard.SydApi.NALG_SM4, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData); - } - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } else { - synchronized (api) { - try { - if (Consts.ECB_ENC == iFlag) { - return api.SYMEncryptData( - com.sunyard.SydApi.NALG_SM4, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData); - } else { - return api.SYMDecryptData( - com.sunyard.SydApi.NALG_SM4, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData); - } - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - throw le; + private List super_SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { + return super.SYD_SM4_BatchData(iKeyIndex, pcData, iFlag); } @Override public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4_BatchData方法接收参数:iKeyIndex:{},pcData元素个数为:{},iFlag:{}", iKeyIndex, pcData.size(), iFlag); - } - if (iFlag == Consts.ECB_DEC) { - for (byte[] pcdata : pcData) { - if (null == pcData || pcdata.length == 0) { - throw new SydApiException(19); - } + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0 ; i < pcData.size(); i++ ) { + byte[] data = pcData.get( i ); + if (null == data) { + data = new byte[0]; } - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - - String[] keys = new String[iKeyIndex.length]; - updateLastUseTime(); - for (int i = 0; i < iKeyIndex.length; i++) { - keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); - } - - SydApiException le = new SydApiException(-1); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - if (Consts.ECB_ENC == iFlag) { - return api.SYMEncryptDecryptBatchData(8, 1, null, keys, 1, pcData); - - } else { - return api.SYMEncryptDecryptBatchData(9, 1, null, keys, 1, pcData); - } - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } + if ( + curDataGroup.size() <= 9 // 分组小于等于 9 个 + && (totalLen + data.length < BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { + curDataGroup.add(data); + curKeyGroup.add( iKeyIndex[i] ); + totalLen += data.length; } else { - synchronized (api) { - try { - if (Consts.ECB_ENC == iFlag) { - return api.SYMEncryptDecryptBatchData(8, 1, null, keys, 1, pcData); + // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add( curKeyGroup ); - } else { - return api.SYMEncryptDecryptBatchData(9, 1, null, keys, 1, pcData); - } - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - throw le; - } + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); - @Override - public byte[] SYD_SM4_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4_LongData方法接收参数:iKeyIndex:{},pcData:{},iPkgNum:{},iFlag:{}", iKeyIndex, Arrays.toString(pcData), iPkgNum, iFlag); - } - if (iFlag == Consts.ECB_DEC && (null == pcData || pcData.length == 0)) { - throw new SydApiException(19); - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - updateLastUseTime(); - String keyIndex = String.format("%08d", iKeyIndex); + curDataGroup.add(data); + curKeyGroup.add( iKeyIndex[i] ); - SydApiException le = new SydApiException(-1); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - if (Consts.ECB_ENC == iFlag) { - return api.SYD_SM4_LongData( - 8, - 1, null, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData, iPkgNum); - } else { - return api.SYD_SM4_LongData( - 9, - 1, null, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData, iPkgNum); - } - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } else { - synchronized (api) { - try { - if (Consts.ECB_ENC == iFlag) { - return api.SYD_SM4_LongData( - 8, - 1, null, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData, iPkgNum); - } else { - return api.SYD_SM4_LongData( - 9, - 1, null, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData, iPkgNum); - } - - } catch (SydApiException e) { - if (null==e){ - - } - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } + totalLen = data.length; } } - throw le; + dataGroups.add( curDataGroup ); + keyGroups.add( curKeyGroup ); + + // 并发处理 + List>> tasks = new ArrayList<>(); + for ( int i = 0; i < dataGroups.size(); i++ ) { + + int finalI = i; + FutureTask> task = longLinkWorks.fTask(new Callable>() { + @Override + public List call() throws Exception { + return super_SYD_SM4_BatchData(toIntArray(keyGroups.get( finalI )), dataGroups.get( finalI ), iFlag); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask> t : tasks) { + ret.addAll(t.get()); + } + return ret; + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101); + } } @Override public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_BatchData:iKeyIndex:{},pcData元素个数为:{}", iKeyIndex, pcData.size()); - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - - String[] keys = new String[iKeyIndex.length]; - updateLastUseTime(); - for (int i = 0; i < iKeyIndex.length; i++) { - keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); - } - SydApiException le = new SydApiException(-1); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - String[] ret = new String[list.size()]; - for (int i = 0; i < list.size(); i++) { - byte[] mac = new byte[16]; - byte[] buff = list.get(i); - System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret[i] = Util.bytes2HexString(buff); - } - return ret; - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } else { - synchronized (api) { - try { - List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - String[] ret = new String[list.size()]; - for (int i = 0; i < list.size(); i++) { - byte[] mac = new byte[16]; - byte[] buff = list.get(i); - System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret[i] = Util.bytes2HexString(buff); - } - return ret; - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - throw le; + return super.SYD_SM4Mac_BatchData(iKeyIndex, pcData); } @Override public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_BatchData方法接收参数:iKeyIndex:{},pcData元素个数为:{},pcMac:{}", iKeyIndex, pcData.size(), Arrays.toString(pcMac)); - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - - String[] keys = new String[iKeyIndex.length]; - updateLastUseTime(); - for (int i = 0; i < iKeyIndex.length; i++) { - keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); - } - - SydApiException le = new SydApiException(-1); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - boolean[] ret = new boolean[list.size()]; - for (int i = 0; i < list.size(); i++) { - byte[] mac = new byte[16]; - byte[] buff = list.get(i); - System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret[i] = pcMac[i].equals(Util.bytes2HexString(buff)); - } - - return ret; - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } else { - synchronized (api) { - try { - List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); - boolean[] ret = new boolean[list.size()]; - for (int i = 0; i < list.size(); i++) { - byte[] mac = new byte[16]; - byte[] buff = list.get(i); - System.arraycopy(buff, buff.length - 16, mac, 0, 16); - ret[i] = pcMac[i].equals(Util.bytes2HexString(buff)); - } - - return ret; - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - throw le; + return super.SYD_SM4Mac_BatchData(iKeyIndex, pcData, pcMac); } - @Override - public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_LongData方法接收参数:iKeyIndex:{},pcData:{},iPkgNum:{},pcProcData:{}", iKeyIndex, Arrays.toString(pcData), iPkgNum, pcProcData); + private static int[] toIntArray(List list){ + if ( null == list || 0 == list.size() ) { + return new int[0]; } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); + int[] ia = new int[ list.size() ]; + for ( int i = 0 ; i < ia.length; i ++ ) { + ia[i] = list.get(i); } - - String keyIndex = String.format("%08d", iKeyIndex); - - byte[] iv = null; - - // 仅一包 和 第一包 忽略 pcProcData 参数 - if (Consts.PkgNumAll != iPkgNum && Consts.PkgNumHead != iPkgNum) { - iv = pcProcData.getBytes(); - } - SydApiException le = new SydApiException(-1); - updateLastUseTime(); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - byte[] ret = api.SYD_SM4_LongData( - 8, - 2, iv, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData, iPkgNum); - - byte[] mac = new byte[16]; - System.arraycopy(ret, ret.length - 16, mac, 0, 16); - - // 仅一包 和 尾包 返回最终结果 - if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) { - return new LongDataReturn<>(null, Util.bytes2HexString(mac)); - } else { - // 返回中间值 - return new LongDataReturn<>(Util.bytes2HexString(mac), null); - } - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } else { - synchronized (api) { - try { - byte[] ret = api.SYD_SM4_LongData( - 8, - 2, iv, - "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), - 1, - pcData, iPkgNum); - - byte[] mac = new byte[16]; - System.arraycopy(ret, ret.length - 16, mac, 0, 16); - - // 仅一包 和 尾包 返回最终结果 - if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) { - return new LongDataReturn<>(null, Util.bytes2HexString(mac)); - } else { - // 返回中间值 - return new LongDataReturn<>(Util.bytes2HexString(mac), null); - } - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - throw le; - } - - @Override - public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData, String pcMac) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_LongData方法接收参数:iKeyIndex:{},pcData:{},iPkgNum:{},pcProcData:{}", iKeyIndex, Arrays.toString(pcData), iPkgNum, pcProcData, pcMac); - } - updateLastUseTime(); - LongDataReturn ret = SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData); - - // 仅一包 和 尾包 返回最终结果 - if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) { - return new LongDataReturn<>(null, pcMac.equals(ret.getData())); - } else { - // 返回中间值 - return new LongDataReturn<>(ret.getProcData(), false); - } - } - - @Override - public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_ShortData方法接收参数:iKeyIndex:{},pcData:{},iFlag:{}", iKeyIndex, Arrays.toString(pcData)); - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - String keyIndex = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex)); - log.debug("\"SK\" + SYMUtil.genPrivateKeyMark方法返回值:{}", keyIndex); - - SydApiException le = new SydApiException(-1); - updateLastUseTime(); - for (SydApi4j api : this.hsms) { - if (null == api) { - continue; - } - if (isShortLinkMode) { - try { - - return api.SYD_SM4Mac_ShortData(keyIndex, pcData); - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - else { - synchronized (api){ - try { - - return api.SYD_SM4Mac_ShortData(keyIndex, pcData); - - } catch (SydApiException e) { - le = e; - if (e.getRetCode() < 0) { - log.error("HA 重试"); - continue; - } - throw e; - } - } - } - } - throw le; - } - - @Override - public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) { - Logger log = LogFactory.getLogger(); - if (LogFactory.iLogLevel == 3) { - log.debug("SYD_SM4Mac_ShortData方法接收参数:{}", iKeyIndex, Arrays.toString(pcData), pcMac); - } - if (null == this.hsms || this.hsms.length < 1) { - throw new SydApiException(-1); - } - - if (null == pcMac) { - throw new IllegalArgumentException(); - } - updateLastUseTime(); - String mac = this.SYD_SM4Mac_ShortData(iKeyIndex, pcData); - log.debug(this + ".SYD_SM4Mac_ShortData方法返回值:{}", mac); - return pcMac.equals(mac); - } - - - @Override - public SydApiSM4 initSM4(int iKeyIndex, int ende) { - - return new SydApiSM4(this,iKeyIndex,ende); - } - public SydApiSM3 initSM3() { - - return new SydApiSM3(this); - } - - @Override - public SydSM4Mac initSM4Mac(int iKeyIndex) { - return new SydSM4Mac(this, iKeyIndex); + return ia; } } diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Function.java b/src/main/java/com/sunyard/sge/database/SydApi4Function.java new file mode 100644 index 0000000..b0281d0 --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/SydApi4Function.java @@ -0,0 +1,789 @@ +package com.sunyard.sge.database; + +import com.sunyard.SydApiException; +import com.sunyard.proto.Util; +import com.sunyard.sge.database.pool.HsmLinkInfo; +import com.sunyard.sge.log.LogFactory; +import com.sunyard.sge.pool.ObjectInPool; +import com.sunyard.util.SYMUtil; +import org.apache.logging.log4j.Logger; +import racal.sunyard.main.SydApi4j; + +import java.util.Arrays; +import java.util.List; + +/** + * 上海黄金交易所 - 数据库加密方案 + */ +public class SydApi4Function implements SydApi { + + static { + SydApi.SYD_SetLogConfig("./logs/", 0); + } + + private SydApi4j[] hsms = null; + private HsmLinkInfo[] linkInfos = null; + private ObjectInPool oip = null; + + private boolean isShortLinkMode = false; + + public SydApi4Function() { + isShortLinkMode = true; + } + + public SydApi4Function(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) { + this.hsms = hsms; + this.linkInfos = linkInfos; + } + + public SydApi4j[] getHsms() { + return hsms; + } + + public HsmLinkInfo[] getLinkInfos() { + return linkInfos; + } + + public void setOip(ObjectInPool oip) { + this.oip = oip; + } + + private void updateLastUseTime(){ + if ( null != this.oip ) { + this.oip.updateLastUseTime(); + } + } + + @Override + public SydApi SYD_Short_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int allDealTimeOut) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_Connect_Ex方法接收参数:pcIpList:{},iPortList:{},iConnectTimeOut:{},iDealTimeOut:{}", Arrays.toString(pcIpList), Arrays.toString(iPortList), iConnectTimeOut, allDealTimeOut); + } + + if (pcIpList.length != iPortList.length) { + throw new IllegalArgumentException("ip与端口数量不一致"); + } + SydApi4j[] apis = new SydApi4j[pcIpList.length]; + int iDealTimeOut = allDealTimeOut / pcIpList.length; + boolean connected = false; + for (int i = 0; i < pcIpList.length; i++) { + + try { + + apis[i] = (SydApi4j) new SydApi4j().connect(pcIpList[i], iPortList[i], null, iConnectTimeOut, iDealTimeOut); + connected = true; + } catch (Exception e) { + // 忽略错误 + log.error("网络连接错误 {} {} - 忽略", pcIpList[i], iPortList[i]); + } + + } + if (!connected) { + // TODO + throw new SydApiException("连接错误", -1); + } + + + hsms = apis; + isShortLinkMode = true; + return this; + } + + public void SYD_Disconnect() { + if (null == hsms) { + return; + } + try { + for (int i = 0; i < hsms.length; i++) { + SydApi4j api = hsms[i]; + if (null != api) { + try { + api.disconnect(); + } catch (Exception e) { + + } + } + } + } catch (Exception e) { + + } + hsms = null; + } + + @Override + public void SYD_Disconnect_Ex() { + + if (isShortLinkMode) { + SYD_Disconnect(); + } + + // 配合链接池,不再需要释放。 + } + + @Override + public String SYD_SM3_Hash_ShortData(byte[] pcData) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM3_Hash_ShortData方法接收参数:pcData:{}", Arrays.toString(pcData)); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + SydApiException le = new SydApiException(-1); + + updateLastUseTime(); + for (SydApi4j api : this.hsms) { + + if (null == api) { + 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 { + 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; + } + } + } + } + throw le; + } + + @Override + public LongDataReturn SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM3_Hash_LongData方法接收参数:pcData:{},iPkgNum:{},pcProcData:{}", Arrays.toString(pcData), iPkgNum, pcProcData); + } + + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + byte[] procData = null; + if (2 == iPkgNum || 3 == iPkgNum) { + procData = Util.hexString2Bytes(pcProcData); + log.debug("Util.hexString2Bytes方法返回值:{}", Arrays.toString(procData)); + + } + + SydApiException le = new SydApiException(-1); + updateLastUseTime(); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + byte[] hash = api.SYD_SM3_LongData(pcData, procData, iPkgNum); + log.debug("api.SYD_SM3_LongData方法返回值:{}", Arrays.toString(hash)); + if (0 == iPkgNum || 3 == iPkgNum) { + return new LongDataReturn(null, Util.bytes2HexString(hash)); + } else { + return new LongDataReturn(Util.bytes2HexString(hash), null); + } + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + byte[] hash = api.SYD_SM3_LongData(pcData, procData, iPkgNum); + log.debug("api.SYD_SM3_LongData方法返回值:{}", Arrays.toString(hash)); + if (0 == iPkgNum || 3 == iPkgNum) { + return new LongDataReturn(null, Util.bytes2HexString(hash)); + } else { + return new LongDataReturn(Util.bytes2HexString(hash), null); + } + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + + throw le; + } + + @Override + public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4_ShortData方法接收参数:iKeyIndex:{},pcData:{},iFlag:{}", iKeyIndex, Arrays.toString(pcData), iFlag); + } + if (iFlag == Consts.ECB_DEC && null == pcData || pcData.length == 0) { + throw new SydApiException(19); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + + updateLastUseTime(); + String keyIndex = String.format("%08d", iKeyIndex); + SydApiException le = new SydApiException(-1); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + if (Consts.ECB_ENC == iFlag) { + return api.SYMEncryptData( + com.sunyard.SydApi.NALG_SM4, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData); + } else { + return api.SYMDecryptData( + com.sunyard.SydApi.NALG_SM4, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData); + } + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + if (Consts.ECB_ENC == iFlag) { + return api.SYMEncryptData( + com.sunyard.SydApi.NALG_SM4, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData); + } else { + return api.SYMDecryptData( + com.sunyard.SydApi.NALG_SM4, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData); + } + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + throw le; + } + + @Override + public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4_BatchData方法接收参数:iKeyIndex:{},pcData元素个数为:{},iFlag:{}", iKeyIndex, pcData.size(), iFlag); + } + if (iFlag == Consts.ECB_DEC) { + for (byte[] pcdata : pcData) { + if (null == pcData || pcdata.length == 0) { + throw new SydApiException(19); + } + } + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + + String[] keys = new String[iKeyIndex.length]; + updateLastUseTime(); + for (int i = 0; i < iKeyIndex.length; i++) { + keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); + } + + SydApiException le = new SydApiException(-1); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + if (Consts.ECB_ENC == iFlag) { + return api.SYMEncryptDecryptBatchData(8, 1, null, keys, 1, pcData); + + } else { + return api.SYMEncryptDecryptBatchData(9, 1, null, keys, 1, pcData); + } + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + if (Consts.ECB_ENC == iFlag) { + return api.SYMEncryptDecryptBatchData(8, 1, null, keys, 1, pcData); + + } else { + return api.SYMEncryptDecryptBatchData(9, 1, null, keys, 1, pcData); + } + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + throw le; + } + + @Override + public byte[] SYD_SM4_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4_LongData方法接收参数:iKeyIndex:{},pcData:{},iPkgNum:{},iFlag:{}", iKeyIndex, Arrays.toString(pcData), iPkgNum, iFlag); + } + if (iFlag == Consts.ECB_DEC && (null == pcData || pcData.length == 0)) { + throw new SydApiException(19); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + updateLastUseTime(); + String keyIndex = String.format("%08d", iKeyIndex); + + SydApiException le = new SydApiException(-1); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + if (Consts.ECB_ENC == iFlag) { + return api.SYD_SM4_LongData( + 8, + 1, null, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData, iPkgNum); + } else { + return api.SYD_SM4_LongData( + 9, + 1, null, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData, iPkgNum); + } + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + if (Consts.ECB_ENC == iFlag) { + return api.SYD_SM4_LongData( + 8, + 1, null, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData, iPkgNum); + } else { + return api.SYD_SM4_LongData( + 9, + 1, null, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData, iPkgNum); + } + + } catch (SydApiException e) { + if (null==e){ + + } + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + + throw le; + } + + @Override + public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4Mac_BatchData:iKeyIndex:{},pcData元素个数为:{}", iKeyIndex, pcData.size()); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + + String[] keys = new String[iKeyIndex.length]; + updateLastUseTime(); + for (int i = 0; i < iKeyIndex.length; i++) { + keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); + } + SydApiException le = new SydApiException(-1); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); + String[] ret = new String[list.size()]; + for (int i = 0; i < list.size(); i++) { + byte[] mac = new byte[16]; + byte[] buff = list.get(i); + System.arraycopy(buff, buff.length - 16, mac, 0, 16); + ret[i] = Util.bytes2HexString(buff); + } + return ret; + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); + String[] ret = new String[list.size()]; + for (int i = 0; i < list.size(); i++) { + byte[] mac = new byte[16]; + byte[] buff = list.get(i); + System.arraycopy(buff, buff.length - 16, mac, 0, 16); + ret[i] = Util.bytes2HexString(buff); + } + return ret; + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + throw le; + } + + @Override + public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4Mac_BatchData方法接收参数:iKeyIndex:{},pcData元素个数为:{},pcMac:{}", iKeyIndex, pcData.size(), Arrays.toString(pcMac)); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + + String[] keys = new String[iKeyIndex.length]; + updateLastUseTime(); + for (int i = 0; i < iKeyIndex.length; i++) { + keys[i] = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex[i])); + } + + SydApiException le = new SydApiException(-1); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); + boolean[] ret = new boolean[list.size()]; + for (int i = 0; i < list.size(); i++) { + byte[] mac = new byte[16]; + byte[] buff = list.get(i); + System.arraycopy(buff, buff.length - 16, mac, 0, 16); + ret[i] = pcMac[i].equals(Util.bytes2HexString(buff)); + } + + return ret; + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + List list = api.SYMEncryptDecryptBatchData(8, 2, null, keys, 1, pcData); + boolean[] ret = new boolean[list.size()]; + for (int i = 0; i < list.size(); i++) { + byte[] mac = new byte[16]; + byte[] buff = list.get(i); + System.arraycopy(buff, buff.length - 16, mac, 0, 16); + ret[i] = pcMac[i].equals(Util.bytes2HexString(buff)); + } + + return ret; + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + throw le; + } + + @Override + public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4Mac_LongData方法接收参数:iKeyIndex:{},pcData:{},iPkgNum:{},pcProcData:{}", iKeyIndex, Arrays.toString(pcData), iPkgNum, pcProcData); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + + String keyIndex = String.format("%08d", iKeyIndex); + + byte[] iv = null; + + // 仅一包 和 第一包 忽略 pcProcData 参数 + if (Consts.PkgNumAll != iPkgNum && Consts.PkgNumHead != iPkgNum) { + iv = pcProcData.getBytes(); + } + SydApiException le = new SydApiException(-1); + updateLastUseTime(); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + byte[] ret = api.SYD_SM4_LongData( + 8, + 2, iv, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData, iPkgNum); + + byte[] mac = new byte[16]; + System.arraycopy(ret, ret.length - 16, mac, 0, 16); + + // 仅一包 和 尾包 返回最终结果 + if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) { + return new LongDataReturn<>(null, Util.bytes2HexString(mac)); + } else { + // 返回中间值 + return new LongDataReturn<>(Util.bytes2HexString(mac), null); + } + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } else { + synchronized (api) { + try { + byte[] ret = api.SYD_SM4_LongData( + 8, + 2, iv, + "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", keyIndex), + 1, + pcData, iPkgNum); + + byte[] mac = new byte[16]; + System.arraycopy(ret, ret.length - 16, mac, 0, 16); + + // 仅一包 和 尾包 返回最终结果 + if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) { + return new LongDataReturn<>(null, Util.bytes2HexString(mac)); + } else { + // 返回中间值 + return new LongDataReturn<>(Util.bytes2HexString(mac), null); + } + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + throw le; + } + + @Override + public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData, String pcMac) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4Mac_LongData方法接收参数:iKeyIndex:{},pcData:{},iPkgNum:{},pcProcData:{}", iKeyIndex, Arrays.toString(pcData), iPkgNum, pcProcData, pcMac); + } + updateLastUseTime(); + LongDataReturn ret = SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData); + + // 仅一包 和 尾包 返回最终结果 + if (Consts.PkgNumAll == iPkgNum || Consts.PkgNumTail == iPkgNum) { + return new LongDataReturn<>(null, pcMac.equals(ret.getData())); + } else { + // 返回中间值 + return new LongDataReturn<>(ret.getProcData(), false); + } + } + + @Override + public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4Mac_ShortData方法接收参数:iKeyIndex:{},pcData:{},iFlag:{}", iKeyIndex, Arrays.toString(pcData)); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + String keyIndex = "SK" + SYMUtil.genPrivateKeyMark("000000", "00A", String.format("%08d", iKeyIndex)); + log.debug("\"SK\" + SYMUtil.genPrivateKeyMark方法返回值:{}", keyIndex); + + SydApiException le = new SydApiException(-1); + updateLastUseTime(); + for (SydApi4j api : this.hsms) { + if (null == api) { + continue; + } + if (isShortLinkMode) { + try { + + return api.SYD_SM4Mac_ShortData(keyIndex, pcData); + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + else { + synchronized (api){ + try { + + return api.SYD_SM4Mac_ShortData(keyIndex, pcData); + + } catch (SydApiException e) { + le = e; + if (e.getRetCode() < 0) { + log.error("HA 重试"); + continue; + } + throw e; + } + } + } + } + throw le; + } + + @Override + public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) { + Logger log = LogFactory.getLogger(); + if (LogFactory.iLogLevel == 3) { + log.debug("SYD_SM4Mac_ShortData方法接收参数:{}", iKeyIndex, Arrays.toString(pcData), pcMac); + } + if (null == this.hsms || this.hsms.length < 1) { + throw new SydApiException(-1); + } + + if (null == pcMac) { + throw new IllegalArgumentException(); + } + updateLastUseTime(); + String mac = this.SYD_SM4Mac_ShortData(iKeyIndex, pcData); + log.debug(this + ".SYD_SM4Mac_ShortData方法返回值:{}", mac); + return pcMac.equals(mac); + } + + + @Override + public SydApiSM4 initSM4(int iKeyIndex, int ende) { + + return new SydApiSM4(this,iKeyIndex,ende); + } + public SydApiSM3 initSM3() { + + return new SydApiSM3(this); + } + + @Override + public SydSM4Mac initSM4Mac(int iKeyIndex) { + return new SydSM4Mac(this, iKeyIndex); + } +} diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM4.java b/src/main/java/com/sunyard/sge/database/SydApiSM4.java index 8fa89d4..d1b3f78 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiSM4.java +++ b/src/main/java/com/sunyard/sge/database/SydApiSM4.java @@ -13,7 +13,7 @@ public class SydApiSM4 { private int iFlag; private boolean is_finished = false; private byte[] dataResult = new byte[0]; - BytesQueue queue = new BytesQueue(); + private BytesQueue queue = new BytesQueue(); public SydApiSM4(SydApi api, int iKeyIndex, int endeFlag) { diff --git a/src/main/java/com/sunyard/sge/pool/CommWorker.java b/src/main/java/com/sunyard/sge/pool/CommWorker.java new file mode 100644 index 0000000..7e462c3 --- /dev/null +++ b/src/main/java/com/sunyard/sge/pool/CommWorker.java @@ -0,0 +1,42 @@ +package com.sunyard.sge.pool; + + +import java.util.concurrent.*; + +/** + * 负责真正的阻塞通信 + */ +public class CommWorker { + // 连接池配置 + private final PoolConfig poolConfig; + // 真正的通信线程 + private final ExecutorService threadPool; + + public CommWorker(){ + this( new PoolConfig() ); + } + public CommWorker(PoolConfig poolConfig) { + this.poolConfig = poolConfig; + threadPool = new ThreadPoolExecutor( + this.poolConfig.getKeepAliveNumber(), + this.poolConfig.getMaxAliveNumber(), + this.poolConfig.getMaxIdle(), + TimeUnit.MILLISECONDS, + new LinkedBlockingQueue() + ); + } + + /** + * 执行一个异步任务 + * @param callable + * @param + * @return + */ + public FutureTask fTask(Callable callable) { + FutureTask task = new FutureTask<>(callable); + threadPool.submit( task ); + return task; + } + + +} diff --git a/src/main/java/com/sunyard/sge/pool/PoolConfig.java b/src/main/java/com/sunyard/sge/pool/PoolConfig.java index 71c0d44..75f89c8 100644 --- a/src/main/java/com/sunyard/sge/pool/PoolConfig.java +++ b/src/main/java/com/sunyard/sge/pool/PoolConfig.java @@ -3,10 +3,16 @@ package com.sunyard.sge.pool; public class PoolConfig { // 最大空闲时间 - private long maxIdle = 5L * 60L ; // 5 分钟 + private long maxIdle = 5L * 60 * 1000L ; // 5 分钟 // 最大无用时间 - private long maxUseless = 30L * 60L ; // 30 分钟 + private long maxUseless = 30L * 60 * 1000L ; // 30 分钟 + + // 最小保持连接数 + private int keepAliveNumber = 5; + + // 最大连接数 + private int maxAliveNumber = 100; public long getMaxIdle() { return maxIdle; @@ -23,4 +29,20 @@ public class PoolConfig { public void setMaxUseless(long maxUseless) { this.maxUseless = maxUseless; } + + public int getKeepAliveNumber() { + return keepAliveNumber; + } + + public void setKeepAliveNumber(int keepAliveNumber) { + this.keepAliveNumber = keepAliveNumber; + } + + public int getMaxAliveNumber() { + return maxAliveNumber; + } + + public void setMaxAliveNumber(int maxAliveNumber) { + this.maxAliveNumber = maxAliveNumber; + } } diff --git a/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java b/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java index 1567adb..9ca03d6 100644 --- a/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java +++ b/src/main/java/com/sunyard/sge/pool/ThreadBasedConnectPool.java @@ -1,23 +1,19 @@ package com.sunyard.sge.pool; import com.sunyard.sge.database.SydApi; -import com.sunyard.sge.database.SydApi4Database; import com.sunyard.sge.log.LogFactory; import org.apache.logging.log4j.Logger; - import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; public class ThreadBasedConnectPool { static { - SydApi.SYD_SetLogConfig("./logs/", 0); + SydApi.SYD_SetLogConfig("./logs/", 0); } // ThreadLocal @@ -42,8 +38,22 @@ public class ThreadBasedConnectPool { Iterator>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry> entry = it.next(); + ObjectInPool oip = entry.getValue(); + if (Thread.State.TERMINATED == entry.getKey().getState()) { + // 如果线程结束 + log.debug("回收一个链接,关联线程已释放。"); + + it.remove(); + + try { + free(oip.getObject()); + } catch (Exception e) { + } + continue; + } + if (System.currentTimeMillis() - oip.getLasUseAt() < config.getMaxIdle()) { // 空闲时间不足,免检。 continue; @@ -51,7 +61,7 @@ public class ThreadBasedConnectPool { if (System.currentTimeMillis() - oip.getLasUseAt() > config.getMaxUseless()) { // 长时间未使用,回收链接 - log.debug("回收一个链接"); + log.debug("回收一个链接,超时。"); it.remove(); @@ -67,11 +77,10 @@ public class ThreadBasedConnectPool { checkPass = check(entry.getValue().getObjectForCheck()); } catch (Exception e) { checkPass = false; - } - finally { + } finally { } - if ( ! checkPass) { + if (!checkPass) { log.debug("一个链接检查未通过"); // 检查未通过 it.remove(); @@ -129,7 +138,7 @@ public class ThreadBasedConnectPool { map.remove(Thread.currentThread()); } - protected void afterInit(ObjectInPool oip, T value ){ + protected void afterInit(ObjectInPool oip, T value) { } @@ -137,7 +146,7 @@ public class ThreadBasedConnectPool { T value = initialValue(); ObjectInPool opi = new ObjectInPool<>(value); map.put(Thread.currentThread(), opi); - afterInit( opi , value); + afterInit(opi, value); return value; } } diff --git a/src/test/java/sample/ShortLinkSample.java b/src/test/java/sample/ShortLinkSample.java index 34ad022..ecfa57f 100644 --- a/src/test/java/sample/ShortLinkSample.java +++ b/src/test/java/sample/ShortLinkSample.java @@ -11,10 +11,13 @@ public class ShortLinkSample { SydApi.SYD_SetLogConfig("./logs/",3); String[] pcipList = {"127.0.0.1", "192.168.0.200" }; - int[] iportList ={8080,8889}; + int[] iportList = {8080,8889}; SydApi api = new SydApi4Database(); try { api.SYD_Short_Connect_Ex(pcipList,iportList,10,10); + + + } finally { if ( null != api ) { api.SYD_Disconnect_Ex(); diff --git a/src/test/java/test/BatchDataTest.java b/src/test/java/test/BatchDataTest.java new file mode 100644 index 0000000..8f4fcb6 --- /dev/null +++ b/src/test/java/test/BatchDataTest.java @@ -0,0 +1,73 @@ +package test; + +import com.sunyard.proto.Util; +import com.sunyard.sge.database.*; +import org.checkerframework.checker.units.qual.A; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +public class BatchDataTest { + + private SydApi api; + + @Before + public void init() { +// System.setProperty("com.sunyard.sydapi4j.debug", "true"); + + SydApiBuilder builder = new SydApiBuilder( + new String[]{"192.168.1.129"}, + new int[]{8889}, + 10, + 15 + + ); + api = builder.build(); + } + + @After + public void end(){ + if ( null != api ) { + api.SYD_Disconnect_Ex(); + } + } + + + @Test + public void batchSM4Case1(){ + // 密钥索引 + int[] keyIdx = new int[]{ 0, 1, 2 , 0, 1, 2, 0, 1, 2, 0, 1, 2}; // 12 组 + // 测试数据 + List data = new ArrayList<>(); + data.add( new byte[8] ); + data.add( new byte[16] ); + data.add( new byte[1024] ); + data.add( new byte[8] ); + data.add( new byte[16] ); + data.add( new byte[1024] ); + data.add( new byte[8] ); + data.add( new byte[16] ); + data.add( new byte[1024] ); + data.add( new byte[8] ); + data.add( new byte[16] ); + data.add( new byte[1024] ); + + List encData = api.SYD_SM4_BatchData( keyIdx , data, Consts.ECB_ENC ); + List orgData = api.SYD_SM4_BatchData( keyIdx , encData, Consts.ECB_DEC ); + + for ( int i = 0 ; i < data.size() ; i++ ) { + System.out.println( "HEX=" + Util.bytes2HexString( encData.get( i ) ) ); + Assert.assertArrayEquals( orgData.get( i ), data.get( i ) ); + } + } + + +} + diff --git a/src/test/java/test/FutureTaskTest.java b/src/test/java/test/FutureTaskTest.java new file mode 100644 index 0000000..2e8e305 --- /dev/null +++ b/src/test/java/test/FutureTaskTest.java @@ -0,0 +1,66 @@ +package test; + +import com.sunyard.sge.pool.CommWorker; +import com.sunyard.sge.pool.PoolConfig; +import org.junit.Test; + +import java.util.concurrent.*; + +public class FutureTaskTest { + + /** + * 并发任务 + */ + @Test + public void case1() throws ExecutionException, InterruptedException, TimeoutException { + PoolConfig poolConfig = new PoolConfig(); + CommWorker workers = new CommWorker(poolConfig); + + long startAt = System.currentTimeMillis(); + try { + FutureTask task1 = workers.fTask(new Callable() { + + @Override + public Integer call() throws Exception { + System.out.println( Thread.currentThread() + " task start"); + Thread.sleep( 1000 ); + System.out.println( Thread.currentThread() + " task over"); + return 1; + } + }); + + FutureTask task2 = workers.fTask(new Callable() { + + @Override + public Integer call() throws Exception { + System.out.println( Thread.currentThread() + " task start"); + Thread.sleep( 2000 ); + System.out.println( Thread.currentThread() + " task over"); + return 1; + } + }); + + FutureTask task3 = workers.fTask(new Callable() { + + @Override + public Integer call() throws Exception { + System.out.println( Thread.currentThread() + " task start"); + Thread.sleep( 3000 ); + System.out.println( Thread.currentThread() + " task over"); + return 1; + } + }); + + + task1.get( ); + task2.get( ); + task3.get( ); + }finally { + + long endAt = System.currentTimeMillis(); + + System.out.println("耗时 " + ( endAt - startAt ) ); + } + } + +} diff --git a/src/test/java/test/Test.java b/src/test/java/test/Test.java index e060ed2..8b833d0 100644 --- a/src/test/java/test/Test.java +++ b/src/test/java/test/Test.java @@ -92,13 +92,12 @@ package test; //} +import java.util.ArrayList; +import java.util.List; + public class Test { public static void main(String[] args) { - if (16 > 1799 + 16 - || - (1799 + 16)/16<2 - ) { - System.out.println("1"); - } + List keyGroups = new ArrayList<>(); + keyGroups.toArray( new Integer[0] ); } } From ce43b10cc63bafd99a22103bdea7e7220760dc29 Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 8 Sep 2022 15:54:42 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/com/sunyard/sge/database/SydApi.java | 2 +- .../sunyard/sge/database/SydApi4Database.java | 202 +++++++++++--- .../sunyard/sge/database/SydApi4Function.java | 4 - .../sunyard/sge/database/SydApiShortLink.java | 253 ++++++++++++++++++ .../com/sunyard/sge/database/SydApiWrap.java | 105 ++++++++ .../sunyard/sge/database/pool/Workers.java | 19 ++ src/test/java/sample/ConnectThread.java | 51 ++++ src/test/java/test/BatchDataTest.java | 171 ++++++++++-- sydapi-database.iml | 108 -------- 10 files changed, 744 insertions(+), 173 deletions(-) create mode 100644 src/main/java/com/sunyard/sge/database/SydApiShortLink.java create mode 100644 src/main/java/com/sunyard/sge/database/SydApiWrap.java create mode 100644 src/main/java/com/sunyard/sge/database/pool/Workers.java create mode 100644 src/test/java/sample/ConnectThread.java delete mode 100644 sydapi-database.iml diff --git a/pom.xml b/pom.xml index fcede36..827cee5 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ com.sunyard sydapi4j - 1.0.20220805 + 1.13.20220908 diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java index 26d5fd5..58026b0 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi.java +++ b/src/main/java/com/sunyard/sge/database/SydApi.java @@ -29,7 +29,7 @@ public interface SydApi { throw new IllegalArgumentException("地址不能为空且等级范围为0到3"); } Logger logger = LogFactory.createLogger(pcLogPath, iLogLevel); - SydApi4j.setLogger(logger); +// SydApi4j.setLogger(logger); } /** diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index 1d5dc00..644415a 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -6,13 +6,18 @@ import com.sunyard.sge.pool.CommWorker; import racal.sunyard.main.SydApi4j; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; -public class SydApi4Database extends SydApi4Function { + +/** + * 主要用于短连接 + */ +public class SydApi4Database extends SydApiShortLink { private static final int BATCH_SIZE = 7680; + // 长连接的所有处理 private static final CommWorker longLinkWorks = new CommWorker(); public SydApi4Database() { @@ -24,10 +29,6 @@ public class SydApi4Database extends SydApi4Function { } - private List super_SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { - return super.SYD_SM4_BatchData(iKeyIndex, pcData, iFlag); - } - @Override public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { // 将数据进行分组,防止超长。 @@ -38,45 +39,42 @@ public class SydApi4Database extends SydApi4Function { List curDataGroup = new ArrayList<>(); List curKeyGroup = new ArrayList<>(); - for (int i = 0 ; i < pcData.size(); i++ ) { - byte[] data = pcData.get( i ); + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); if (null == data) { data = new byte[0]; } if ( - curDataGroup.size() <= 9 // 分组小于等于 9 个 - && (totalLen + data.length < BATCH_SIZE) // 总大小小于 BATCH_SIZE - ) { - curDataGroup.add(data); - curKeyGroup.add( iKeyIndex[i] ); - totalLen += data.length; - } else { - // 扩展包 + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { // 扩展包 dataGroups.add(curDataGroup); - keyGroups.add( curKeyGroup ); + keyGroups.add(curKeyGroup); curDataGroup = new ArrayList<>(); curKeyGroup = new ArrayList<>(); - - curDataGroup.add(data); - curKeyGroup.add( iKeyIndex[i] ); - - totalLen = data.length; } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen = data.length; + } - dataGroups.add( curDataGroup ); - keyGroups.add( curKeyGroup ); + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); // 并发处理 List>> tasks = new ArrayList<>(); - for ( int i = 0; i < dataGroups.size(); i++ ) { + for (int i = 0; i < dataGroups.size(); i++) { int finalI = i; FutureTask> task = longLinkWorks.fTask(new Callable>() { @Override public List call() throws Exception { - return super_SYD_SM4_BatchData(toIntArray(keyGroups.get( finalI )), dataGroups.get( finalI ), iFlag); + return SydApi4Database.super.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag); } }); tasks.add(task); @@ -90,26 +88,164 @@ public class SydApi4Database extends SydApi4Function { return ret; } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101); + throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { - return super.SYD_SM4Mac_BatchData(iKeyIndex, pcData); + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) {// 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + } + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen = data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + // 并发处理 + List> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask task = longLinkWorks.fTask(new Callable() { + @Override + public String[] call() throws Exception { + return SydApi4Database.super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask t : tasks) { + String[] macs = t.get(); + ret.addAll(Arrays.asList(macs)); + } + return ret.toArray(new String[0]); + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } @Override public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { - return super.SYD_SM4Mac_BatchData(iKeyIndex, pcData, pcMac); + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + List> macGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + List curMacGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { + // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + curMacGroup = new ArrayList<>(); + } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + curMacGroup.add(pcMac[i]); + totalLen = data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + // 并发处理 + List> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask task = longLinkWorks.fTask(new Callable() { + @Override + public boolean[] call() throws Exception { + return SydApi4Database.super.SYD_SM4Mac_BatchData( + toIntArray(keyGroups.get(finalI)), + dataGroups.get(finalI), + macGroups.get(finalI).toArray(new String[0]) + ); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask t : tasks) { + boolean[] rets = t.get(); + for (boolean r : rets) { + ret.add(r); + } + } + return toBoolArray(ret); + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } - private static int[] toIntArray(List list){ - if ( null == list || 0 == list.size() ) { + private static int[] toIntArray(List list) { + if (null == list || 0 == list.size()) { return new int[0]; } - int[] ia = new int[ list.size() ]; - for ( int i = 0 ; i < ia.length; i ++ ) { + int[] ia = new int[list.size()]; + for (int i = 0; i < ia.length; i++) { + ia[i] = list.get(i); + } + return ia; + } + + private static boolean[] toBoolArray(List list) { + if (null == list || 0 == list.size()) { + return new boolean[0]; + } + boolean[] ia = new boolean[list.size()]; + for (int i = 0; i < ia.length; i++) { ia[i] = list.get(i); } return ia; diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Function.java b/src/main/java/com/sunyard/sge/database/SydApi4Function.java index b0281d0..73097b8 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Function.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Function.java @@ -17,10 +17,6 @@ import java.util.List; */ public class SydApi4Function implements SydApi { - static { - SydApi.SYD_SetLogConfig("./logs/", 0); - } - private SydApi4j[] hsms = null; private HsmLinkInfo[] linkInfos = null; private ObjectInPool oip = null; diff --git a/src/main/java/com/sunyard/sge/database/SydApiShortLink.java b/src/main/java/com/sunyard/sge/database/SydApiShortLink.java new file mode 100644 index 0000000..58d0ebf --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/SydApiShortLink.java @@ -0,0 +1,253 @@ +package com.sunyard.sge.database; + +import com.sunyard.SydApiException; +import com.sunyard.sge.database.pool.HsmLinkInfo; +import com.sunyard.sge.pool.CommWorker; +import racal.sunyard.main.SydApi4j; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; + + +/** + * 主要用于短连接 + */ +public class SydApiShortLink extends SydApi4Function { + private static final int BATCH_SIZE = 7680; + // 长连接的所有处理 + private static final CommWorker longLinkWorks = new CommWorker(); + + public SydApiShortLink() { + super(); + } + + public SydApiShortLink(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) { + super(hsms, linkInfos); + } + + + @Override + public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen = data.length; + + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + // 并发处理 + List>> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask> task = longLinkWorks.fTask(new Callable>() { + @Override + public List call() throws Exception { + return SydApiShortLink.super.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask> t : tasks) { + ret.addAll(t.get()); + } + return ret; + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } + } + + @Override + public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) {// 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + } + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen = data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + // 并发处理 + List> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask task = longLinkWorks.fTask(new Callable() { + @Override + public String[] call() throws Exception { + return SydApiShortLink.super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask t : tasks) { + String[] macs = t.get(); + ret.addAll(Arrays.asList(macs)); + } + return ret.toArray(new String[0]); + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } + } + + @Override + public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + List> macGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + List curMacGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { + // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + curMacGroup = new ArrayList<>(); + } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + curMacGroup.add(pcMac[i]); + totalLen = data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + // 并发处理 + List> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask task = longLinkWorks.fTask(new Callable() { + @Override + public boolean[] call() throws Exception { + return SydApiShortLink.super.SYD_SM4Mac_BatchData( + toIntArray(keyGroups.get(finalI)), + dataGroups.get(finalI), + macGroups.get(finalI).toArray(new String[0]) + ); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask t : tasks) { + boolean[] rets = t.get(); + for (boolean r : rets) { + ret.add(r); + } + } + return toBoolArray(ret); + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } + } + + private static int[] toIntArray(List list) { + if (null == list || 0 == list.size()) { + return new int[0]; + } + int[] ia = new int[list.size()]; + for (int i = 0; i < ia.length; i++) { + ia[i] = list.get(i); + } + return ia; + } + + private static boolean[] toBoolArray(List list) { + if (null == list || 0 == list.size()) { + return new boolean[0]; + } + boolean[] ia = new boolean[list.size()]; + for (int i = 0; i < ia.length; i++) { + ia[i] = list.get(i); + } + return ia; + } +} diff --git a/src/main/java/com/sunyard/sge/database/SydApiWrap.java b/src/main/java/com/sunyard/sge/database/SydApiWrap.java new file mode 100644 index 0000000..d5350e1 --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/SydApiWrap.java @@ -0,0 +1,105 @@ +package com.sunyard.sge.database; + +import com.sunyard.sge.database.pool.Workers; + +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; + +/** + * 长连接的真正执行过程转发到长连接线程池中执行。 + */ +public class SydApiWrap implements SydApi{ + + private SydApiBuilder builder; + + public SydApiWrap(SydApiBuilder builder) { + this.builder = builder; + } + + @Override + public SydApi SYD_Short_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iDealTimeOut) { + throw new UnsupportedOperationException("此对象为长连接专用"); + } + + @Override + public void SYD_Disconnect_Ex() { + // pass + } + + @Override + public String SYD_SM3_Hash_ShortData(byte[] pcData) { + FutureTask task = Workers.getLongLinkWorks().fTask(new Callable() { + @Override + public String call() throws Exception { + return builder.build().SYD_SM3_Hash_ShortData(pcData); + } + }); + return task.get(); + } + + @Override + public LongDataReturn SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) { + return null; + } + + @Override + public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) { + return new byte[0]; + } + + @Override + public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { + return null; + } + + @Override + public byte[] SYD_SM4_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) { + return new byte[0]; + } + + @Override + public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + return new String[0]; + } + + @Override + public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { + return new boolean[0]; + } + + @Override + public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) { + return null; + } + + @Override + public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData, String pcMac) { + return null; + } + + @Override + public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { + return null; + } + + @Override + public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) { + return false; + } + + @Override + public SydApiSM4 initSM4(int iKeyIndex, int ende) { + return null; + } + + @Override + public SydApiSM3 initSM3() { + return null; + } + + @Override + public SydSM4Mac initSM4Mac(int iKeyIndex) { + return null; + } +} diff --git a/src/main/java/com/sunyard/sge/database/pool/Workers.java b/src/main/java/com/sunyard/sge/database/pool/Workers.java new file mode 100644 index 0000000..2614fb5 --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/pool/Workers.java @@ -0,0 +1,19 @@ +package com.sunyard.sge.database.pool; + +import com.sunyard.sge.pool.CommWorker; + +public class Workers { + // 长连接的所有处理 + private static final CommWorker longLinkWorks = new CommWorker(); + + // 短链接 批量处理 + private static final CommWorker shortLinkWorks = new CommWorker(); + + public static CommWorker getLongLinkWorks() { + return longLinkWorks; + } + + public static CommWorker getShortLinkWorks() { + return shortLinkWorks; + } +} diff --git a/src/test/java/sample/ConnectThread.java b/src/test/java/sample/ConnectThread.java new file mode 100644 index 0000000..400ecb9 --- /dev/null +++ b/src/test/java/sample/ConnectThread.java @@ -0,0 +1,51 @@ +package sample; + +import com.sunyard.SydApi; +import racal.sunyard.main.SydApi4j; +import racal.sunyard.main.SydApiBuilder; + +public class ConnectThread extends Thread { + + public SydApi getApi() { + SydApiBuilder builder = new SydApiBuilder().setIp("172.16.18.59"); + SydApi4j papi = (SydApi4j) builder.build(); +// SydApi4j papi = (SydApi4j) new SydApi4j().connect("172.16.18.59" , 8889, null,1000); + return papi; + } + public static void main(String[] args) { + + // logger.info("测试开始"); + int n = Runtime.getRuntime().availableProcessors(); + int max = 1001; + Thread[] tList = new Thread[max]; + for (int i = 0; i < max; i++) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + System.out.println(Thread.currentThread().getName() + "已运行"); + ConnectThread stable = new ConnectThread(); + SydApi api = stable.getApi(); + try { +// SydApi api = stable.getApi(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + }); + tList[i] = thread; + } + for (Thread t : tList) { + t.start(); + } + for (Thread t : tList) { + try { + t.join(); + } catch (InterruptedException e3) { + e3.printStackTrace(); + } + } + + } +} + diff --git a/src/test/java/test/BatchDataTest.java b/src/test/java/test/BatchDataTest.java index 8f4fcb6..3dbe67a 100644 --- a/src/test/java/test/BatchDataTest.java +++ b/src/test/java/test/BatchDataTest.java @@ -1,22 +1,60 @@ package test; import com.sunyard.proto.Util; -import com.sunyard.sge.database.*; -import org.checkerframework.checker.units.qual.A; +import com.sunyard.sge.database.Consts; +import com.sunyard.sge.database.SydApi; +import com.sunyard.sge.database.SydApiBuilder; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.nio.ByteBuffer; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Random; public class BatchDataTest { private SydApi api; + private static class RandomTestData { + private int size; + private int[] keyIdx; + private List data; + + public int[] getKeyIdx() { + return keyIdx; + } + + public List getData() { + return data; + } + + public int getSize() { + return size; + } + + public RandomTestData(int lucky) { + this.size = lucky; + this.keyIdx = new int[lucky]; + this.data = new ArrayList<>(); + for ( int i = 0 ; i < lucky; i++ ) { + byte[] data = new byte[ new Random().nextInt(1024) ]; + new Random().nextBytes( data ); + this.data.add( data ); + } + } + public RandomTestData() { + int lucky = new Random().nextInt(100); + this.size = lucky; + this.keyIdx = new int[lucky]; + this.data = new ArrayList<>(); + for ( int i = 0 ; i < lucky; i++ ) { + byte[] data = new byte[ new Random().nextInt(1024) ]; + new Random().nextBytes( data ); + this.data.add( data ); + } + } + } @Before public void init() { @@ -33,41 +71,122 @@ public class BatchDataTest { } @After - public void end(){ - if ( null != api ) { + public void end() { + if (null != api) { api.SYD_Disconnect_Ex(); } } - @Test - public void batchSM4Case1(){ + public void batchSM4Case1() { // 密钥索引 - int[] keyIdx = new int[]{ 0, 1, 2 , 0, 1, 2, 0, 1, 2, 0, 1, 2}; // 12 组 + int[] keyIdx = new int[]{0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2}; // 12 组 // 测试数据 List data = new ArrayList<>(); - data.add( new byte[8] ); - data.add( new byte[16] ); - data.add( new byte[1024] ); - data.add( new byte[8] ); - data.add( new byte[16] ); - data.add( new byte[1024] ); - data.add( new byte[8] ); - data.add( new byte[16] ); - data.add( new byte[1024] ); - data.add( new byte[8] ); - data.add( new byte[16] ); - data.add( new byte[1024] ); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); - List encData = api.SYD_SM4_BatchData( keyIdx , data, Consts.ECB_ENC ); - List orgData = api.SYD_SM4_BatchData( keyIdx , encData, Consts.ECB_DEC ); + List encData = api.SYD_SM4_BatchData(keyIdx, data, Consts.ECB_ENC); + List orgData = api.SYD_SM4_BatchData(keyIdx, encData, Consts.ECB_DEC); - for ( int i = 0 ; i < data.size() ; i++ ) { - System.out.println( "HEX=" + Util.bytes2HexString( encData.get( i ) ) ); - Assert.assertArrayEquals( orgData.get( i ), data.get( i ) ); + for (int i = 0; i < data.size(); i++) { + System.out.println("HEX=" + Util.bytes2HexString(encData.get(i))); + Assert.assertArrayEquals(orgData.get(i), data.get(i)); } } + @Test + public void batchSM4Case2() { + // 测试数据 + RandomTestData data = new RandomTestData(); + List encData = api.SYD_SM4_BatchData(data.getKeyIdx(), data.getData(), Consts.ECB_ENC); + List orgData = api.SYD_SM4_BatchData(data.getKeyIdx(), encData, Consts.ECB_DEC); + + for (int i = 0; i < data.getSize(); i++) { + System.out.println("HEX=" + Util.bytes2HexString(encData.get(i))); + Assert.assertArrayEquals(orgData.get(i), data.getData().get(i)); + } + } + + @Test + public void batchSM4CaseZero() { + // 测试数据 + RandomTestData data = new RandomTestData(0); + + List encData = api.SYD_SM4_BatchData(data.getKeyIdx(), data.getData(), Consts.ECB_ENC); + List orgData = api.SYD_SM4_BatchData(data.getKeyIdx(), encData, Consts.ECB_DEC); + + for (int i = 0; i < data.getSize(); i++) { + System.out.println("HEX=" + Util.bytes2HexString(encData.get(i))); + Assert.assertArrayEquals(orgData.get(i), data.getData().get(i)); + } + } + + @Test + public void batchMACDataCase1() { + // 密钥索引 + int[] keyIdx = new int[]{0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2}; // 12 组 + // 测试数据 + List data = new ArrayList<>(); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); + data.add(new byte[8]); + data.add(new byte[16]); + data.add(new byte[1024]); + + String[] macs = api.SYD_SM4Mac_BatchData(keyIdx, data); + boolean[] checks = api.SYD_SM4Mac_BatchData(keyIdx, data, macs); + + for (int i = 0; i < data.size(); i++) { + System.out.println("MAC[" + i + "]=" + macs[i]); + Assert.assertTrue(checks[i]); + } + } + + @Test + public void batchMACData() { + // 测试数据 + RandomTestData data = new RandomTestData(); + + String[] macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); + boolean[] checks = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData(), macs); + + for (int i = 0; i < data.getSize(); i++) { + System.out.println("MAC[" + i + "]=" + macs[i]); + Assert.assertTrue(checks[i]); + } + } + + @Test + public void batchMACDataZero() { + // 测试数据 + RandomTestData data = new RandomTestData(0); + + String[] macs = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData()); + boolean[] checks = api.SYD_SM4Mac_BatchData(data.getKeyIdx(), data.getData(), macs); + + for (int i = 0; i < data.getSize(); i++) { + System.out.println("MAC[" + i + "]=" + macs[i]); + Assert.assertTrue(checks[i]); + } + } } diff --git a/sydapi-database.iml b/sydapi-database.iml deleted file mode 100644 index c99d6c7..0000000 --- a/sydapi-database.iml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From c563ef91d3a7265e73cc48eafe6f84e1d05bc496 Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 8 Sep 2022 16:18:39 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=B8=89=E7=B1=BB=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sunyard/sge/database/SydApi.java | 5 +- .../sunyard/sge/database/SydApi4Database.java | 23 +- .../sunyard/sge/database/SydApi4Function.java | 33 ++- ...ydApiWrap.java => SydApiLongLinkWrap.java} | 27 +- .../sunyard/sge/database/SydApiShortLink.java | 253 ------------------ .../database/{SydApiSM3.java => SydSM3.java} | 11 +- .../database/{SydApiSM4.java => SydSM4.java} | 4 +- ...SydApiSM4Backup.java => SydSM4Backup.java} | 4 +- src/test/java/test/LongDataTest.java | 18 +- 9 files changed, 68 insertions(+), 310 deletions(-) rename src/main/java/com/sunyard/sge/database/{SydApiWrap.java => SydApiLongLinkWrap.java} (73%) delete mode 100644 src/main/java/com/sunyard/sge/database/SydApiShortLink.java rename src/main/java/com/sunyard/sge/database/{SydApiSM3.java => SydSM3.java} (87%) rename src/main/java/com/sunyard/sge/database/{SydApiSM4.java => SydSM4.java} (97%) rename src/main/java/com/sunyard/sge/database/{SydApiSM4Backup.java => SydSM4Backup.java} (98%) diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java index 58026b0..15e9fd3 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi.java +++ b/src/main/java/com/sunyard/sge/database/SydApi.java @@ -2,7 +2,6 @@ package com.sunyard.sge.database; import com.sunyard.sge.log.LogFactory; import org.apache.logging.log4j.Logger; -import racal.sunyard.main.SydApi4j; import java.util.List; @@ -272,9 +271,9 @@ public interface SydApi { ); - public SydApiSM4 initSM4(int iKeyIndex, int ende); + public SydSM4 initSM4(int iKeyIndex, int ende); - public SydApiSM3 initSM3(); + public SydSM3 initSM3(); public SydSM4Mac initSM4Mac(int iKeyIndex); } diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index 644415a..fb8b6d0 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -15,7 +15,7 @@ import java.util.concurrent.FutureTask; /** * 主要用于短连接 */ -public class SydApi4Database extends SydApiShortLink { +public class SydApi4Database extends SydApi4Function { private static final int BATCH_SIZE = 7680; // 长连接的所有处理 private static final CommWorker longLinkWorks = new CommWorker(); @@ -229,25 +229,4 @@ public class SydApi4Database extends SydApiShortLink { } } - private static int[] toIntArray(List list) { - if (null == list || 0 == list.size()) { - return new int[0]; - } - int[] ia = new int[list.size()]; - for (int i = 0; i < ia.length; i++) { - ia[i] = list.get(i); - } - return ia; - } - - private static boolean[] toBoolArray(List list) { - if (null == list || 0 == list.size()) { - return new boolean[0]; - } - boolean[] ia = new boolean[list.size()]; - for (int i = 0; i < ia.length; i++) { - ia[i] = list.get(i); - } - return ia; - } } diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Function.java b/src/main/java/com/sunyard/sge/database/SydApi4Function.java index 73097b8..fa8e5c1 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Function.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Function.java @@ -769,17 +769,42 @@ public class SydApi4Function implements SydApi { @Override - public SydApiSM4 initSM4(int iKeyIndex, int ende) { + public SydSM4 initSM4(int iKeyIndex, int ende) { - return new SydApiSM4(this,iKeyIndex,ende); + return new SydSM4(this,iKeyIndex,ende); } - public SydApiSM3 initSM3() { - return new SydApiSM3(this); + @Override + public SydSM3 initSM3() { + return new SydSM3(this); } @Override public SydSM4Mac initSM4Mac(int iKeyIndex) { return new SydSM4Mac(this, iKeyIndex); } + + + + protected static int[] toIntArray(List list) { + if (null == list || 0 == list.size()) { + return new int[0]; + } + int[] ia = new int[list.size()]; + for (int i = 0; i < ia.length; i++) { + ia[i] = list.get(i); + } + return ia; + } + + protected static boolean[] toBoolArray(List list) { + if (null == list || 0 == list.size()) { + return new boolean[0]; + } + boolean[] ia = new boolean[list.size()]; + for (int i = 0; i < ia.length; i++) { + ia[i] = list.get(i); + } + return ia; + } } diff --git a/src/main/java/com/sunyard/sge/database/SydApiWrap.java b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java similarity index 73% rename from src/main/java/com/sunyard/sge/database/SydApiWrap.java rename to src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java index d5350e1..6487186 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiWrap.java +++ b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java @@ -1,5 +1,6 @@ package com.sunyard.sge.database; +import com.sunyard.SydApiException; import com.sunyard.sge.database.pool.Workers; import java.util.List; @@ -9,11 +10,11 @@ import java.util.concurrent.FutureTask; /** * 长连接的真正执行过程转发到长连接线程池中执行。 */ -public class SydApiWrap implements SydApi{ +public class SydApiLongLinkWrap implements SydApi { private SydApiBuilder builder; - public SydApiWrap(SydApiBuilder builder) { + public SydApiLongLinkWrap(SydApiBuilder builder) { this.builder = builder; } @@ -35,12 +36,26 @@ public class SydApiWrap implements SydApi{ return builder.build().SYD_SM3_Hash_ShortData(pcData); } }); - return task.get(); + try { + return task.get(); + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } @Override public LongDataReturn SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) { - return null; + FutureTask> task = Workers.getLongLinkWorks().fTask(new Callable>() { + @Override + public LongDataReturn call() throws Exception { + return builder.build().SYD_SM3_Hash_LongData(pcData,iPkgNum, pcProcData); + } + }); + try { + return task.get(); + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } @Override @@ -89,12 +104,12 @@ public class SydApiWrap implements SydApi{ } @Override - public SydApiSM4 initSM4(int iKeyIndex, int ende) { + public SydSM4 initSM4(int iKeyIndex, int ende) { return null; } @Override - public SydApiSM3 initSM3() { + public SydSM3 initSM3() { return null; } diff --git a/src/main/java/com/sunyard/sge/database/SydApiShortLink.java b/src/main/java/com/sunyard/sge/database/SydApiShortLink.java deleted file mode 100644 index 58d0ebf..0000000 --- a/src/main/java/com/sunyard/sge/database/SydApiShortLink.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.sunyard.sge.database; - -import com.sunyard.SydApiException; -import com.sunyard.sge.database.pool.HsmLinkInfo; -import com.sunyard.sge.pool.CommWorker; -import racal.sunyard.main.SydApi4j; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; - - -/** - * 主要用于短连接 - */ -public class SydApiShortLink extends SydApi4Function { - private static final int BATCH_SIZE = 7680; - // 长连接的所有处理 - private static final CommWorker longLinkWorks = new CommWorker(); - - public SydApiShortLink() { - super(); - } - - public SydApiShortLink(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) { - super(hsms, linkInfos); - } - - - @Override - public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { - // 将数据进行分组,防止超长。 - List> dataGroups = new ArrayList<>(); - List> keyGroups = new ArrayList<>(); - int totalLen = 0; - - List curDataGroup = new ArrayList<>(); - List curKeyGroup = new ArrayList<>(); - - for (int i = 0; i < pcData.size(); i++) { - byte[] data = pcData.get(i); - if (null == data) { - data = new byte[0]; - } - if ( - curDataGroup.size() > 9 // 分组小于等于 9 个 - || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE - ) { // 扩展包 - dataGroups.add(curDataGroup); - keyGroups.add(curKeyGroup); - - curDataGroup = new ArrayList<>(); - curKeyGroup = new ArrayList<>(); - } - - - curDataGroup.add(data); - curKeyGroup.add(iKeyIndex[i]); - - totalLen = data.length; - - } - - dataGroups.add(curDataGroup); - keyGroups.add(curKeyGroup); - - // 并发处理 - List>> tasks = new ArrayList<>(); - for (int i = 0; i < dataGroups.size(); i++) { - - int finalI = i; - FutureTask> task = longLinkWorks.fTask(new Callable>() { - @Override - public List call() throws Exception { - return SydApiShortLink.super.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag); - } - }); - tasks.add(task); - } - - try { - List ret = new ArrayList<>(); - for (FutureTask> t : tasks) { - ret.addAll(t.get()); - } - return ret; - - } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101, e); - } - } - - @Override - public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { - // 将数据进行分组,防止超长。 - List> dataGroups = new ArrayList<>(); - List> keyGroups = new ArrayList<>(); - int totalLen = 0; - - List curDataGroup = new ArrayList<>(); - List curKeyGroup = new ArrayList<>(); - - for (int i = 0; i < pcData.size(); i++) { - byte[] data = pcData.get(i); - if (null == data) { - data = new byte[0]; - } - if ( - curDataGroup.size() > 9 // 分组小于等于 9 个 - || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE - ) {// 扩展包 - dataGroups.add(curDataGroup); - keyGroups.add(curKeyGroup); - - curDataGroup = new ArrayList<>(); - curKeyGroup = new ArrayList<>(); - } - - curDataGroup.add(data); - curKeyGroup.add(iKeyIndex[i]); - - totalLen = data.length; - } - - dataGroups.add(curDataGroup); - keyGroups.add(curKeyGroup); - - // 并发处理 - List> tasks = new ArrayList<>(); - for (int i = 0; i < dataGroups.size(); i++) { - - int finalI = i; - FutureTask task = longLinkWorks.fTask(new Callable() { - @Override - public String[] call() throws Exception { - return SydApiShortLink.super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); - } - }); - tasks.add(task); - } - - try { - List ret = new ArrayList<>(); - for (FutureTask t : tasks) { - String[] macs = t.get(); - ret.addAll(Arrays.asList(macs)); - } - return ret.toArray(new String[0]); - - } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101, e); - } - } - - @Override - public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { - // 将数据进行分组,防止超长。 - List> dataGroups = new ArrayList<>(); - List> keyGroups = new ArrayList<>(); - List> macGroups = new ArrayList<>(); - int totalLen = 0; - - List curDataGroup = new ArrayList<>(); - List curKeyGroup = new ArrayList<>(); - List curMacGroup = new ArrayList<>(); - - for (int i = 0; i < pcData.size(); i++) { - byte[] data = pcData.get(i); - if (null == data) { - data = new byte[0]; - } - if ( - curDataGroup.size() > 9 // 分组小于等于 9 个 - || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE - ) { - // 扩展包 - dataGroups.add(curDataGroup); - keyGroups.add(curKeyGroup); - macGroups.add(curMacGroup); - - curDataGroup = new ArrayList<>(); - curKeyGroup = new ArrayList<>(); - curMacGroup = new ArrayList<>(); - } - - - curDataGroup.add(data); - curKeyGroup.add(iKeyIndex[i]); - curMacGroup.add(pcMac[i]); - totalLen = data.length; - } - - dataGroups.add(curDataGroup); - keyGroups.add(curKeyGroup); - macGroups.add(curMacGroup); - - // 并发处理 - List> tasks = new ArrayList<>(); - for (int i = 0; i < dataGroups.size(); i++) { - - int finalI = i; - FutureTask task = longLinkWorks.fTask(new Callable() { - @Override - public boolean[] call() throws Exception { - return SydApiShortLink.super.SYD_SM4Mac_BatchData( - toIntArray(keyGroups.get(finalI)), - dataGroups.get(finalI), - macGroups.get(finalI).toArray(new String[0]) - ); - } - }); - tasks.add(task); - } - - try { - List ret = new ArrayList<>(); - for (FutureTask t : tasks) { - boolean[] rets = t.get(); - for (boolean r : rets) { - ret.add(r); - } - } - return toBoolArray(ret); - - } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101, e); - } - } - - private static int[] toIntArray(List list) { - if (null == list || 0 == list.size()) { - return new int[0]; - } - int[] ia = new int[list.size()]; - for (int i = 0; i < ia.length; i++) { - ia[i] = list.get(i); - } - return ia; - } - - private static boolean[] toBoolArray(List list) { - if (null == list || 0 == list.size()) { - return new boolean[0]; - } - boolean[] ia = new boolean[list.size()]; - for (int i = 0; i < ia.length; i++) { - ia[i] = list.get(i); - } - return ia; - } -} diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM3.java b/src/main/java/com/sunyard/sge/database/SydSM3.java similarity index 87% rename from src/main/java/com/sunyard/sge/database/SydApiSM3.java rename to src/main/java/com/sunyard/sge/database/SydSM3.java index daafa75..9c6799f 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiSM3.java +++ b/src/main/java/com/sunyard/sge/database/SydSM3.java @@ -3,19 +3,12 @@ package com.sunyard.sge.database; import com.sunyard.SydApiException; -import java.lang.reflect.Array; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class SydApiSM3 { +public class SydSM3 { private boolean is_finished = false; private SydApi api; - private int iPkgNum; private String pcProcData; - public SydApiSM3(SydApi sydApi) { + public SydSM3(SydApi sydApi) { this.api = sydApi; } diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM4.java b/src/main/java/com/sunyard/sge/database/SydSM4.java similarity index 97% rename from src/main/java/com/sunyard/sge/database/SydApiSM4.java rename to src/main/java/com/sunyard/sge/database/SydSM4.java index d1b3f78..7c9dfa4 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiSM4.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4.java @@ -4,7 +4,7 @@ import com.sunyard.SydApiException; import com.sunyard.sge.bytes.BytesQueue; -public class SydApiSM4 { +public class SydSM4 { private SydApi api; private int iKeyIndex; @@ -16,7 +16,7 @@ public class SydApiSM4 { private BytesQueue queue = new BytesQueue(); - public SydApiSM4(SydApi api, int iKeyIndex, int endeFlag) { + public SydSM4(SydApi api, int iKeyIndex, int endeFlag) { this.api = api; this.iFlag = endeFlag; this.iKeyIndex = iKeyIndex; diff --git a/src/main/java/com/sunyard/sge/database/SydApiSM4Backup.java b/src/main/java/com/sunyard/sge/database/SydSM4Backup.java similarity index 98% rename from src/main/java/com/sunyard/sge/database/SydApiSM4Backup.java rename to src/main/java/com/sunyard/sge/database/SydSM4Backup.java index 48d1121..b78a100 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiSM4Backup.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4Backup.java @@ -5,7 +5,7 @@ import com.sunyard.proto.Util; import java.nio.ByteBuffer; -public class SydApiSM4Backup { +public class SydSM4Backup { private SydApi api; private int iKeyIndex; @@ -18,7 +18,7 @@ public class SydApiSM4Backup { ByteBuffer sourceWrap = ByteBuffer.wrap(new byte[0]); - public SydApiSM4Backup(SydApi api, int iKeyIndex, int endeFlag) { + public SydSM4Backup(SydApi api, int iKeyIndex, int endeFlag) { this.api = api; this.iFlag = endeFlag; this.iKeyIndex = iKeyIndex; diff --git a/src/test/java/test/LongDataTest.java b/src/test/java/test/LongDataTest.java index 4c9c0eb..6bc9447 100644 --- a/src/test/java/test/LongDataTest.java +++ b/src/test/java/test/LongDataTest.java @@ -30,7 +30,7 @@ public class LongDataTest { @Test public void sm3_case1() { - SydApiSM3 sm3 = api.initSM3(); + SydSM3 sm3 = api.initSM3(); sm3.update(null); String mac = sm3.digest(); Assert.assertEquals("1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B", mac); @@ -38,7 +38,7 @@ public class LongDataTest { @Test public void sm3_case2() { - SydApiSM3 sm3 = api.initSM3(); + SydSM3 sm3 = api.initSM3(); sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678")); String mac = sm3.digest(); Assert.assertEquals("9431C865C84B02C8A7C503F53A6D6C3C66704F8F713D124610314E31B19937F7", mac); @@ -46,7 +46,7 @@ public class LongDataTest { @Test public void sm3_case3() { - SydApiSM3 sm3 = api.initSM3(); + SydSM3 sm3 = api.initSM3(); sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678")); sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678")); String mac = sm3.digest(); @@ -55,7 +55,7 @@ public class LongDataTest { @Test public void sm3_case4() { - SydApiSM3 sm3 = api.initSM3(); + SydSM3 sm3 = api.initSM3(); System.out.print("org="); for (int i = 0; i < 100; i++) { int lucky = new Random().nextInt(4065); @@ -73,7 +73,7 @@ public class LongDataTest { @Test public void sm3_case5() { - SydApiSM3 sm3 = api.initSM3(); + SydSM3 sm3 = api.initSM3(); String mac = sm3.digest(); Assert.assertEquals("1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B", mac); } @@ -115,7 +115,7 @@ public class LongDataTest { @Test public void case5() { - SydApiSM4 sydApiSM4 = api.initSM4(1, 1); + SydSM4 sydApiSM4 = api.initSM4(1, 1); byte[] enData = sydApiSM4.finish(); System.out.println(Util.bytes2HexString(enData)); Assert.assertArrayEquals(Util.hexString2Bytes("FF49F76AD3A71651FE1A8A9F0D2A689E"), enData); @@ -123,7 +123,7 @@ public class LongDataTest { @Test public void case6() { - SydApiSM4 sydApiSM4 = api.initSM4(1, 1); + SydSM4 sydApiSM4 = api.initSM4(1, 1); for (int i = 0; i < 10; i++) { int lucky = new Random().nextInt(4065); @@ -144,8 +144,8 @@ public class LongDataTest { int max = 1000; int size = 4065; - SydApiSM4 en = api.initSM4(1, 1); - SydApiSM4 de = api.initSM4(1, 0); + SydSM4 en = api.initSM4(1, 1); + SydSM4 de = api.initSM4(1, 0); ByteBuffer inData = ByteBuffer.allocate(max * size); ByteBuffer enData = ByteBuffer.allocate(max * size + 16); From 9540858fa3838930efb0e196760bd61755a732ae Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 8 Sep 2022 20:24:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../java/com/sunyard/sge/database/ISM3.java | 6 + .../java/com/sunyard/sge/database/ISM4.java | 6 + .../com/sunyard/sge/database/ISM4Mac.java | 6 + .../java/com/sunyard/sge/database/SydApi.java | 9 +- .../sunyard/sge/database/SydApi4Database.java | 100 ++----- ...4Function.java => SydApiBaseFunction.java} | 9 +- .../sunyard/sge/database/SydApiBuilder.java | 43 ++- .../sunyard/sge/database/SydApiConfig.java | 3 + .../sge/database/SydApiLongLinkWrap.java | 257 ++++++++++++++++-- .../java/com/sunyard/sge/database/SydSM3.java | 2 +- .../java/com/sunyard/sge/database/SydSM4.java | 7 +- .../sunyard/sge/database/SydSM4Backup.java | 2 +- .../com/sunyard/sge/database/SydSM4Mac.java | 37 +-- .../sunyard/sge/database/pool/SydApiPool.java | 3 +- .../sunyard/sge/database/pool/Workers.java | 19 -- .../java/com/sunyard/sge/pool/PoolConfig.java | 10 + src/test/java/test/FuncTest.java | 12 +- src/test/java/test/LongDataTest.java | 39 ++- 19 files changed, 372 insertions(+), 200 deletions(-) create mode 100644 src/main/java/com/sunyard/sge/database/ISM3.java create mode 100644 src/main/java/com/sunyard/sge/database/ISM4.java create mode 100644 src/main/java/com/sunyard/sge/database/ISM4Mac.java rename src/main/java/com/sunyard/sge/database/{SydApi4Function.java => SydApiBaseFunction.java} (99%) delete mode 100644 src/main/java/com/sunyard/sge/database/pool/Workers.java diff --git a/pom.xml b/pom.xml index 827cee5..1543744 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ com.sunyard sydapi4j - 1.13.20220908 + 1.12.20220908-1 diff --git a/src/main/java/com/sunyard/sge/database/ISM3.java b/src/main/java/com/sunyard/sge/database/ISM3.java new file mode 100644 index 0000000..bfa739d --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/ISM3.java @@ -0,0 +1,6 @@ +package com.sunyard.sge.database; + +public interface ISM3 { + public void update(byte[] pcData); + public String digest(); +} diff --git a/src/main/java/com/sunyard/sge/database/ISM4.java b/src/main/java/com/sunyard/sge/database/ISM4.java new file mode 100644 index 0000000..c824256 --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/ISM4.java @@ -0,0 +1,6 @@ +package com.sunyard.sge.database; + +public interface ISM4 { + public byte[] update(byte[] pcData); + public byte[] finish(); +} diff --git a/src/main/java/com/sunyard/sge/database/ISM4Mac.java b/src/main/java/com/sunyard/sge/database/ISM4Mac.java new file mode 100644 index 0000000..0f061e8 --- /dev/null +++ b/src/main/java/com/sunyard/sge/database/ISM4Mac.java @@ -0,0 +1,6 @@ +package com.sunyard.sge.database; + +public interface ISM4Mac { + public void update(byte[] pcData); + public String disget(); +} diff --git a/src/main/java/com/sunyard/sge/database/SydApi.java b/src/main/java/com/sunyard/sge/database/SydApi.java index 15e9fd3..7973d6f 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi.java +++ b/src/main/java/com/sunyard/sge/database/SydApi.java @@ -2,6 +2,7 @@ package com.sunyard.sge.database; import com.sunyard.sge.log.LogFactory; import org.apache.logging.log4j.Logger; +import racal.sunyard.main.SydApi4j; import java.util.List; @@ -28,7 +29,7 @@ public interface SydApi { throw new IllegalArgumentException("地址不能为空且等级范围为0到3"); } Logger logger = LogFactory.createLogger(pcLogPath, iLogLevel); -// SydApi4j.setLogger(logger); + SydApi4j.setLogger(logger); } /** @@ -271,9 +272,9 @@ public interface SydApi { ); - public SydSM4 initSM4(int iKeyIndex, int ende); + public ISM4 initSM4(int iKeyIndex, int ende); - public SydSM3 initSM3(); + public ISM3 initSM3(); - public SydSM4Mac initSM4Mac(int iKeyIndex); + public ISM4Mac initSM4Mac(int iKeyIndex); } diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Database.java b/src/main/java/com/sunyard/sge/database/SydApi4Database.java index fb8b6d0..d7f3d02 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Database.java +++ b/src/main/java/com/sunyard/sge/database/SydApi4Database.java @@ -1,6 +1,5 @@ package com.sunyard.sge.database; -import com.sunyard.SydApiException; import com.sunyard.sge.database.pool.HsmLinkInfo; import com.sunyard.sge.pool.CommWorker; import racal.sunyard.main.SydApi4j; @@ -8,17 +7,14 @@ import racal.sunyard.main.SydApi4j; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; + +import static com.sunyard.sge.database.SydApiConfig.BATCH_SIZE; /** * 主要用于短连接 */ -public class SydApi4Database extends SydApi4Function { - private static final int BATCH_SIZE = 7680; - // 长连接的所有处理 - private static final CommWorker longLinkWorks = new CommWorker(); +public class SydApi4Database extends SydApiBaseFunction { public SydApi4Database() { super(); @@ -66,30 +62,13 @@ public class SydApi4Database extends SydApi4Function { dataGroups.add(curDataGroup); keyGroups.add(curKeyGroup); - // 并发处理 - List>> tasks = new ArrayList<>(); + // 排队处理 + List ret = new ArrayList<>(); for (int i = 0; i < dataGroups.size(); i++) { - - int finalI = i; - FutureTask> task = longLinkWorks.fTask(new Callable>() { - @Override - public List call() throws Exception { - return SydApi4Database.super.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag); - } - }); - tasks.add(task); + ret.addAll(super.SYD_SM4_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i), iFlag)); } - try { - List ret = new ArrayList<>(); - for (FutureTask> t : tasks) { - ret.addAll(t.get()); - } - return ret; - - } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101, e); - } + return ret; } @Override @@ -127,31 +106,13 @@ public class SydApi4Database extends SydApi4Function { dataGroups.add(curDataGroup); keyGroups.add(curKeyGroup); - // 并发处理 - List> tasks = new ArrayList<>(); + // 排队处理 + List ret = new ArrayList<>(); for (int i = 0; i < dataGroups.size(); i++) { - - int finalI = i; - FutureTask task = longLinkWorks.fTask(new Callable() { - @Override - public String[] call() throws Exception { - return SydApi4Database.super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); - } - }); - tasks.add(task); - } - - try { - List ret = new ArrayList<>(); - for (FutureTask t : tasks) { - String[] macs = t.get(); - ret.addAll(Arrays.asList(macs)); - } - return ret.toArray(new String[0]); - - } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101, e); + String[] macs = super.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(i)), dataGroups.get(i)); + ret.addAll(Arrays.asList(macs)); } + return ret.toArray(new String[0]); } @Override @@ -196,37 +157,20 @@ public class SydApi4Database extends SydApi4Function { keyGroups.add(curKeyGroup); macGroups.add(curMacGroup); - // 并发处理 - List> tasks = new ArrayList<>(); + // 排队处理 + List ret = new ArrayList<>(); for (int i = 0; i < dataGroups.size(); i++) { - int finalI = i; - FutureTask task = longLinkWorks.fTask(new Callable() { - @Override - public boolean[] call() throws Exception { - return SydApi4Database.super.SYD_SM4Mac_BatchData( - toIntArray(keyGroups.get(finalI)), - dataGroups.get(finalI), - macGroups.get(finalI).toArray(new String[0]) - ); - } - }); - tasks.add(task); - } - - try { - List ret = new ArrayList<>(); - for (FutureTask t : tasks) { - boolean[] rets = t.get(); - for (boolean r : rets) { - ret.add(r); - } + boolean[] rets = super.SYD_SM4Mac_BatchData( + toIntArray(keyGroups.get(i)), + dataGroups.get(i), + macGroups.get(i).toArray(new String[0]) + ); + for (boolean r : rets) { + ret.add(r); } - return toBoolArray(ret); - - } catch (Exception e) { - throw new SydApiException("并行任务执行失败", 0xC101, e); } + return toBoolArray(ret); } } diff --git a/src/main/java/com/sunyard/sge/database/SydApi4Function.java b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java similarity index 99% rename from src/main/java/com/sunyard/sge/database/SydApi4Function.java rename to src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java index fa8e5c1..7188b04 100644 --- a/src/main/java/com/sunyard/sge/database/SydApi4Function.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java @@ -15,7 +15,7 @@ import java.util.List; /** * 上海黄金交易所 - 数据库加密方案 */ -public class SydApi4Function implements SydApi { +public class SydApiBaseFunction implements SydApi { private SydApi4j[] hsms = null; private HsmLinkInfo[] linkInfos = null; @@ -23,11 +23,11 @@ public class SydApi4Function implements SydApi { private boolean isShortLinkMode = false; - public SydApi4Function() { + public SydApiBaseFunction() { isShortLinkMode = true; } - public SydApi4Function(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) { + public SydApiBaseFunction(SydApi4j[] hsms, HsmLinkInfo[] linkInfos) { this.hsms = hsms; this.linkInfos = linkInfos; } @@ -76,7 +76,6 @@ public class SydApi4Function implements SydApi { } if (!connected) { - // TODO throw new SydApiException("连接错误", -1); } @@ -769,7 +768,7 @@ public class SydApi4Function implements SydApi { @Override - public SydSM4 initSM4(int iKeyIndex, int ende) { + public ISM4 initSM4(int iKeyIndex, int ende) { return new SydSM4(this,iKeyIndex,ende); } diff --git a/src/main/java/com/sunyard/sge/database/SydApiBuilder.java b/src/main/java/com/sunyard/sge/database/SydApiBuilder.java index 5f8aa59..78df6e4 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiBuilder.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBuilder.java @@ -3,6 +3,8 @@ package com.sunyard.sge.database; import com.sunyard.sge.database.pool.HsmLinkInfo; import com.sunyard.sge.database.pool.SydApiPool; import com.sunyard.sge.log.LogFactory; +import com.sunyard.sge.pool.CommWorker; +import com.sunyard.sge.pool.PoolConfig; import org.apache.logging.log4j.Logger; import java.util.Arrays; @@ -12,24 +14,59 @@ public class SydApiBuilder { SydApi.SYD_SetLogConfig("./logs/", 0); } private SydApiPool pool; + private CommWorker longLinkWorks; + + public SydApiBuilder( String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iDealTimeOut + ) { + this( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut, new PoolConfig() ); + } + public SydApiBuilder( + String[] pcIpList, + int[] iPortList, + int iConnectTimeOut, + int iDealTimeOut, + PoolConfig config ) { Logger log = LogFactory.getLogger(); - log.debug("创建链接"); - log.debug("SydApiBuilder构造方法接收参数:pcIpList:{},iPortList:{},iConnectTimeOut:{},iDealTimeOut:{}", Arrays.toString(pcIpList),Arrays.toString(iPortList),iConnectTimeOut,iDealTimeOut); + + if ( log.isDebugEnabled() ) { + log.debug("创建链接"); + log.debug("SydApiBuilder构造方法接收参数:pcIpList:{},iPortList:{},iConnectTimeOut:{},iDealTimeOut:{}", Arrays.toString(pcIpList),Arrays.toString(iPortList),iConnectTimeOut,iDealTimeOut); + log.debug("pool config {}", config); + } + HsmLinkInfo[] linkInfo = HsmLinkInfo.mutiHsmLinkInfo(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut); this.pool = new SydApiPool(linkInfo); + longLinkWorks = new CommWorker(); warmUp( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut ); } - public SydApi build() { + public CommWorker getLongLinkWorks() { + return longLinkWorks; + } + + /** + * 获取池内对象 + * @return 池内对象 + */ + public SydApi get(){ return pool.get(); } + /** + * 升级 + * 修改了原实现 + * @return 包装对象 + */ + public SydApi build() { + return new SydApiLongLinkWrap( this ); + } + private void warmUp(String[] pcIpList, int[] iPortList, diff --git a/src/main/java/com/sunyard/sge/database/SydApiConfig.java b/src/main/java/com/sunyard/sge/database/SydApiConfig.java index eea5aaf..10e6cf0 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiConfig.java +++ b/src/main/java/com/sunyard/sge/database/SydApiConfig.java @@ -4,6 +4,9 @@ package com.sunyard.sge.database; * */ public class SydApiConfig { + // 批量数据,每组最大长度 + public static final int BATCH_SIZE = 7680; + // 数据包长度 private final int MaxDataLenEachPack = 4064; diff --git a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java index 6487186..2828712 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java +++ b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java @@ -1,12 +1,17 @@ package com.sunyard.sge.database; import com.sunyard.SydApiException; -import com.sunyard.sge.database.pool.Workers; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; +import static com.sunyard.sge.database.SydApiBaseFunction.toBoolArray; +import static com.sunyard.sge.database.SydApiBaseFunction.toIntArray; +import static com.sunyard.sge.database.SydApiConfig.BATCH_SIZE; + /** * 长连接的真正执行过程转发到长连接线程池中执行。 */ @@ -30,10 +35,10 @@ public class SydApiLongLinkWrap implements SydApi { @Override public String SYD_SM3_Hash_ShortData(byte[] pcData) { - FutureTask task = Workers.getLongLinkWorks().fTask(new Callable() { + FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { @Override public String call() throws Exception { - return builder.build().SYD_SM3_Hash_ShortData(pcData); + return builder.get().SYD_SM3_Hash_ShortData(pcData); } }); try { @@ -45,10 +50,10 @@ public class SydApiLongLinkWrap implements SydApi { @Override public LongDataReturn SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) { - FutureTask> task = Workers.getLongLinkWorks().fTask(new Callable>() { + FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { @Override public LongDataReturn call() throws Exception { - return builder.build().SYD_SM3_Hash_LongData(pcData,iPkgNum, pcProcData); + return builder.get().SYD_SM3_Hash_LongData(pcData, iPkgNum, pcProcData); } }); try { @@ -60,12 +65,17 @@ public class SydApiLongLinkWrap implements SydApi { @Override public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) { - return new byte[0]; - } - - @Override - public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { - return null; + FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { + @Override + public byte[] call() throws Exception { + return builder.get().SYD_SM4_ShortData(iKeyIndex, pcData, iFlag); + } + }); + try { + return task.get(); + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } @Override @@ -73,15 +83,6 @@ public class SydApiLongLinkWrap implements SydApi { return new byte[0]; } - @Override - public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { - return new String[0]; - } - - @Override - public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { - return new boolean[0]; - } @Override public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) { @@ -104,17 +105,221 @@ public class SydApiLongLinkWrap implements SydApi { } @Override - public SydSM4 initSM4(int iKeyIndex, int ende) { - return null; + public ISM4 initSM4(int iKeyIndex, int ende) { + return new SydSM4(this, iKeyIndex, ende); } @Override - public SydSM3 initSM3() { - return null; + public ISM3 initSM3() { + return new SydSM3(this); } @Override - public SydSM4Mac initSM4Mac(int iKeyIndex) { - return null; + public ISM4Mac initSM4Mac(int iKeyIndex) { + return new SydSM4Mac(this, iKeyIndex); + } + + + @Override + public List SYD_SM4_BatchData(int[] iKeyIndex, List pcData, int iFlag) { + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen = data.length; + + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + // 并发处理 + List>> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { + @Override + public List call() throws Exception { + SydApi api = builder.get(); + return api.SYD_SM4_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI), iFlag); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask> t : tasks) { + ret.addAll(t.get()); + } + return ret; + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } + } + + @Override + public String[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData) { + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) {// 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + } + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + + totalLen = data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + + // 并发处理 + List> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { + @Override + public String[] call() throws Exception { + SydApi api = builder.get(); + return api.SYD_SM4Mac_BatchData(toIntArray(keyGroups.get(finalI)), dataGroups.get(finalI)); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask t : tasks) { + String[] macs = t.get(); + ret.addAll(Arrays.asList(macs)); + } + return ret.toArray(new String[0]); + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } + } + + @Override + public boolean[] SYD_SM4Mac_BatchData(int[] iKeyIndex, List pcData, String[] pcMac) { + // 将数据进行分组,防止超长。 + List> dataGroups = new ArrayList<>(); + List> keyGroups = new ArrayList<>(); + List> macGroups = new ArrayList<>(); + int totalLen = 0; + + List curDataGroup = new ArrayList<>(); + List curKeyGroup = new ArrayList<>(); + List curMacGroup = new ArrayList<>(); + + for (int i = 0; i < pcData.size(); i++) { + byte[] data = pcData.get(i); + if (null == data) { + data = new byte[0]; + } + if ( + curDataGroup.size() > 9 // 分组小于等于 9 个 + || (totalLen + data.length > BATCH_SIZE) // 总大小小于 BATCH_SIZE + ) { + // 扩展包 + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + curDataGroup = new ArrayList<>(); + curKeyGroup = new ArrayList<>(); + curMacGroup = new ArrayList<>(); + } + + + curDataGroup.add(data); + curKeyGroup.add(iKeyIndex[i]); + curMacGroup.add(pcMac[i]); + totalLen = data.length; + } + + dataGroups.add(curDataGroup); + keyGroups.add(curKeyGroup); + macGroups.add(curMacGroup); + + // 并发处理 + List> tasks = new ArrayList<>(); + for (int i = 0; i < dataGroups.size(); i++) { + + int finalI = i; + FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { + @Override + public boolean[] call() throws Exception { + SydApi api = builder.get(); + return api.SYD_SM4Mac_BatchData( + toIntArray(keyGroups.get(finalI)), + dataGroups.get(finalI), + macGroups.get(finalI).toArray(new String[0]) + ); + } + }); + tasks.add(task); + } + + try { + List ret = new ArrayList<>(); + for (FutureTask t : tasks) { + boolean[] rets = t.get(); + for (boolean r : rets) { + ret.add(r); + } + } + return toBoolArray(ret); + + } catch (Exception e) { + throw new SydApiException("并行任务执行失败", 0xC101, e); + } } } diff --git a/src/main/java/com/sunyard/sge/database/SydSM3.java b/src/main/java/com/sunyard/sge/database/SydSM3.java index 9c6799f..50540aa 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM3.java +++ b/src/main/java/com/sunyard/sge/database/SydSM3.java @@ -3,7 +3,7 @@ package com.sunyard.sge.database; import com.sunyard.SydApiException; -public class SydSM3 { +public class SydSM3 implements ISM3 { private boolean is_finished = false; private SydApi api; private String pcProcData; diff --git a/src/main/java/com/sunyard/sge/database/SydSM4.java b/src/main/java/com/sunyard/sge/database/SydSM4.java index 7c9dfa4..f667005 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM4.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4.java @@ -4,7 +4,7 @@ import com.sunyard.SydApiException; import com.sunyard.sge.bytes.BytesQueue; -public class SydSM4 { +public class SydSM4 implements ISM4 { private SydApi api; private int iKeyIndex; @@ -66,9 +66,6 @@ public class SydSM4 { } } else { - if (null == queue || null == pcData) { - throw new IllegalArgumentException(); - } queue.push(pcData); if ((queue.getLength()) / 16 < 2) { return new byte[0]; @@ -78,9 +75,7 @@ public class SydSM4 { iPkgNum = 2; return bytes2; - } - } public byte[] finish() { diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Backup.java b/src/main/java/com/sunyard/sge/database/SydSM4Backup.java index b78a100..e1bf98e 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM4Backup.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4Backup.java @@ -5,7 +5,7 @@ import com.sunyard.proto.Util; import java.nio.ByteBuffer; -public class SydSM4Backup { +public class SydSM4Backup implements ISM4 { private SydApi api; private int iKeyIndex; diff --git a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java index 6073cbe..bb07577 100644 --- a/src/main/java/com/sunyard/sge/database/SydSM4Mac.java +++ b/src/main/java/com/sunyard/sge/database/SydSM4Mac.java @@ -5,31 +5,19 @@ import com.sunyard.sge.bytes.BytesQueue; import java.nio.ByteBuffer; -public class SydSM4Mac { - private SydApi api; - private byte[] last_in_data; - private int iKeyIndex; +public class SydSM4Mac implements ISM4Mac { + private final SydApi api; + private final int iKeyIndex; private int iPkgNum = 1; private String pcProcData; private boolean is_finished; private String pcMac; - private byte[] pcdataResult = new byte[0]; - private String pcdataStr; - BytesQueue queue = new BytesQueue(); + private BytesQueue queue = new BytesQueue(); public SydSM4Mac(SydApi api, int iKeyIndex) { this.api = api; this.iKeyIndex = iKeyIndex; - this.pcProcData = pcProcData; -// this.pcMac=pcMac; - } - - public SydSM4Mac(SydApi api) { - this.api = api; - } - - public void setPcMac(String pcMac) { - this.pcMac = pcMac; + this.pcProcData = null; } public void update(byte[] pcData) { @@ -37,7 +25,7 @@ public class SydSM4Mac { return; } int length = pcData.length; - this.pcdataResult = pcData; + byte[] pcdataResult = pcData; if (is_finished) { throw new SydApiException(-1); } @@ -51,7 +39,7 @@ public class SydSM4Mac { if (length % 16 != 0) { queue.push(pcData); byte[] pop = queue.pop(16, 0); - pcdataResult=pop; + pcdataResult =pop; } if (null == this.pcMac || "".equals(this.pcMac)) { LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pcdataResult, iPkgNum, pcProcData); @@ -82,7 +70,7 @@ public class SydSM4Mac { } } - public LongDataReturn disget() { + public String disget() { if (is_finished) { throw new SydApiException(0); @@ -95,13 +83,8 @@ public class SydSM4Mac { } byte[] pop = queue.pop(); - if (null == this.pcMac || "".equals(this.pcMac)) { - LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData); - return stringStringLongDataReturn; - } else { - LongDataReturn stringBooleanLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData, pcMac); - return stringBooleanLongDataReturn; - } + LongDataReturn stringStringLongDataReturn = api.SYD_SM4Mac_LongData(iKeyIndex, pop, iPkgNum, pcProcData); + return stringStringLongDataReturn.getData(); } diff --git a/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java b/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java index 7dd57cd..cba578a 100644 --- a/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java +++ b/src/main/java/com/sunyard/sge/database/pool/SydApiPool.java @@ -3,6 +3,7 @@ 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; @@ -51,7 +52,7 @@ public class SydApiPool extends ThreadBasedConnectPool { } - return new SydApi4Database(apis, linkInfos); + return new SydApiBaseFunction(apis, linkInfos); } // 保活接口 diff --git a/src/main/java/com/sunyard/sge/database/pool/Workers.java b/src/main/java/com/sunyard/sge/database/pool/Workers.java deleted file mode 100644 index 2614fb5..0000000 --- a/src/main/java/com/sunyard/sge/database/pool/Workers.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sunyard.sge.database.pool; - -import com.sunyard.sge.pool.CommWorker; - -public class Workers { - // 长连接的所有处理 - private static final CommWorker longLinkWorks = new CommWorker(); - - // 短链接 批量处理 - private static final CommWorker shortLinkWorks = new CommWorker(); - - public static CommWorker getLongLinkWorks() { - return longLinkWorks; - } - - public static CommWorker getShortLinkWorks() { - return shortLinkWorks; - } -} diff --git a/src/main/java/com/sunyard/sge/pool/PoolConfig.java b/src/main/java/com/sunyard/sge/pool/PoolConfig.java index 75f89c8..ad7089d 100644 --- a/src/main/java/com/sunyard/sge/pool/PoolConfig.java +++ b/src/main/java/com/sunyard/sge/pool/PoolConfig.java @@ -45,4 +45,14 @@ public class PoolConfig { public void setMaxAliveNumber(int maxAliveNumber) { this.maxAliveNumber = maxAliveNumber; } + + @Override + public String toString() { + return "PoolConfig{" + + "maxIdle=" + maxIdle + + ", maxUseless=" + maxUseless + + ", keepAliveNumber=" + keepAliveNumber + + ", maxAliveNumber=" + maxAliveNumber + + '}'; + } } diff --git a/src/test/java/test/FuncTest.java b/src/test/java/test/FuncTest.java index 7fb6915..70c84ed 100644 --- a/src/test/java/test/FuncTest.java +++ b/src/test/java/test/FuncTest.java @@ -28,8 +28,8 @@ public class FuncTest { @Test public void syd_Short_Connect_Ex(){ - String[] pcipList = {"127.0.0.1", "192.168.0.100" }; - int[] iportList ={8080,8889}; + String[] pcipList = {"192.168.1.129", "192.168.1.129" }; + int[] iportList ={8889,8889}; SydApi api = new SydApi4Database(); try { api.SYD_Short_Connect_Ex(pcipList,iportList,10,10); @@ -58,9 +58,9 @@ public class FuncTest { @Test public void originLong() throws Exception { - SydApiBuilder builder = new SydApiBuilder(new String[]{"192.168.0.200"}, new int[]{8889}, 10, 15); + SydApiBuilder builder = new SydApiBuilder(new String[]{"192.168.1.129"}, new int[]{8889}, 10, 15); SydApi.SYD_SetLogConfig("./logs/",3); - Logger log = LogFactory.getLogger(); + final SydApi api = builder.build(); for (int i = 0; i < 1000; i++) { int tmp = i; @@ -77,8 +77,8 @@ public class FuncTest { public void originShort() throws Exception { SydApi.SYD_SetLogConfig("./logs/",3); Logger log = LogFactory.getLogger(); - String[] pcipList = {"192.168.0.100", "192.168.0.100", "192.168.0.100","192.168.0.100" }; - int[] iportList ={8080,8889,8889,8889}; + String[] pcipList = {"192.168.1.129", "192.168.1.129" }; + int[] iportList ={8080,8889}; for (int i = 0; i < 1000; i++) { int tmp = i; diff --git a/src/test/java/test/LongDataTest.java b/src/test/java/test/LongDataTest.java index 6bc9447..326f4de 100644 --- a/src/test/java/test/LongDataTest.java +++ b/src/test/java/test/LongDataTest.java @@ -19,10 +19,10 @@ public class LongDataTest { // System.setProperty("com.sunyard.sydapi4j.debug", "true"); SydApiBuilder builder = new SydApiBuilder( - new String[]{"192.168.1.128"}, + new String[]{"192.168.1.129"}, new int[]{8889}, 10, - 15 + 30 ); api = builder.build(); @@ -30,7 +30,7 @@ public class LongDataTest { @Test public void sm3_case1() { - SydSM3 sm3 = api.initSM3(); + ISM3 sm3 = api.initSM3(); sm3.update(null); String mac = sm3.digest(); Assert.assertEquals("1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B", mac); @@ -38,7 +38,7 @@ public class LongDataTest { @Test public void sm3_case2() { - SydSM3 sm3 = api.initSM3(); + ISM3 sm3 = api.initSM3(); sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678")); String mac = sm3.digest(); Assert.assertEquals("9431C865C84B02C8A7C503F53A6D6C3C66704F8F713D124610314E31B19937F7", mac); @@ -46,7 +46,7 @@ public class LongDataTest { @Test public void sm3_case3() { - SydSM3 sm3 = api.initSM3(); + ISM3 sm3 = api.initSM3(); sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678")); sm3.update(Util.hexString2Bytes("1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678")); String mac = sm3.digest(); @@ -55,7 +55,7 @@ public class LongDataTest { @Test public void sm3_case4() { - SydSM3 sm3 = api.initSM3(); + ISM3 sm3 = api.initSM3(); System.out.print("org="); for (int i = 0; i < 100; i++) { int lucky = new Random().nextInt(4065); @@ -73,49 +73,44 @@ public class LongDataTest { @Test public void sm3_case5() { - SydSM3 sm3 = api.initSM3(); + ISM3 sm3 = api.initSM3(); String mac = sm3.digest(); Assert.assertEquals("1AB21D8355CFA17F8E61194831E81A8F22BEC8C728FEFB747ED035EB5082AA2B", mac); } @Test public void sm4mac_case1() { - SydSM4Mac sydApiMac = api.initSM4Mac(1); + ISM4Mac sydApiMac = api.initSM4Mac(1); sydApiMac.update(null); - String mac = (String) sydApiMac.disget().getData(); + String mac = sydApiMac.disget(); Assert.assertEquals("FF49F76AD3A71651FE1A8A9F0D2A689E", mac); } @Test public void sm4mac_case2() { - SydSM4Mac sydApiMac = api.initSM4Mac(1); - String mac = (String) sydApiMac.disget().getData(); + ISM4Mac sydApiMac = api.initSM4Mac(1); + String mac = sydApiMac.disget(); Assert.assertEquals("FF49F76AD3A71651FE1A8A9F0D2A689E", mac); } @Test public void sm4mac_case3() { - SydSM4Mac sydApiMac = api.initSM4Mac(1); + ISM4Mac sydApiMac = api.initSM4Mac(1); for (int i = 0; i < 10; i++) { // int lucky = new Random().nextInt(4065); byte[] data = new byte[66]; -// System.out.println("len=" + lucky); -// new Random().nextBytes( data ); -// sydApiMac.setPcMac("405C2DCF4884240B7F2E4FF56B00639A"); - sydApiMac.setPcMac("72A7EFF0004CE7D2A1B7C2260726EC38"); sydApiMac.update(data); } - boolean mac = (boolean) sydApiMac.disget().getData(); -// String mac1 = (String) sydApiMac.disget().getData(); + String mac = (String) sydApiMac.disget(); System.out.println(mac); } @Test public void case5() { - SydSM4 sydApiSM4 = api.initSM4(1, 1); + ISM4 sydApiSM4 = api.initSM4(1, 1); byte[] enData = sydApiSM4.finish(); System.out.println(Util.bytes2HexString(enData)); Assert.assertArrayEquals(Util.hexString2Bytes("FF49F76AD3A71651FE1A8A9F0D2A689E"), enData); @@ -123,7 +118,7 @@ public class LongDataTest { @Test public void case6() { - SydSM4 sydApiSM4 = api.initSM4(1, 1); + ISM4 sydApiSM4 = api.initSM4(1, 1); for (int i = 0; i < 10; i++) { int lucky = new Random().nextInt(4065); @@ -144,8 +139,8 @@ public class LongDataTest { int max = 1000; int size = 4065; - SydSM4 en = api.initSM4(1, 1); - SydSM4 de = api.initSM4(1, 0); + ISM4 en = api.initSM4(1, 1); + ISM4 de = api.initSM4(1, 0); ByteBuffer inData = ByteBuffer.allocate(max * size); ByteBuffer enData = ByteBuffer.allocate(max * size + 16);