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; } }