package com.sunyard.sge.database; import com.sunyard.SydApiException; 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; /** * 长连接的真正执行过程转发到长连接线程池中执行。 */ public class SydApiLongLinkWrap implements SydApi { private SydApiBuilder builder; public SydApiLongLinkWrap(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 = builder.getLongLinkWorks().fTask(new Callable() { @Override public String call() throws Exception { return builder.get().SYD_SM3_Hash_ShortData(pcData); } }); 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) { FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { @Override public LongDataReturn call() throws Exception { return builder.get().SYD_SM3_Hash_LongData(pcData, iPkgNum, pcProcData); } }); try { return task.get(); } catch (Exception e) { throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override public byte[] SYD_SM4_ShortData(int iKeyIndex, byte[] pcData, int iFlag) { 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 public byte[] SYD_SM4_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, int iFlag) { FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { @Override public byte[] call() throws Exception { return builder.get().SYD_SM4_LongData(iKeyIndex, pcData, iPkgNum, iFlag); } }); try { return task.get(); } catch (Exception e) { throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) { FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { @Override public LongDataReturn call() throws Exception { return builder.get().SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData); } }); try { return task.get(); } catch (Exception e) { throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override public LongDataReturn SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData, String pcMac) { FutureTask> task = builder.getLongLinkWorks().fTask(new Callable>() { @Override public LongDataReturn call() throws Exception { return builder.get().SYD_SM4Mac_LongData(iKeyIndex, pcData, iPkgNum, pcProcData, pcMac); } }); try { return task.get(); } catch (Exception e) { throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override public String SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData) { FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { @Override public String call() throws Exception { return builder.get().SYD_SM4Mac_ShortData(iKeyIndex, pcData); } }); try { return task.get(); } catch (Exception e) { throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override public boolean SYD_SM4Mac_ShortData(int iKeyIndex, byte[] pcData, String pcMac) { FutureTask task = builder.getLongLinkWorks().fTask(new Callable() { @Override public Boolean call() throws Exception { return builder.get().SYD_SM4Mac_ShortData(iKeyIndex, pcData, pcMac); } }); try { return task.get(); } catch (Exception e) { throw new SydApiException("并行任务执行失败", 0xC101, e); } } @Override public ISM4 initSM4(int iKeyIndex, int ende) { return new SydSM4(this, iKeyIndex, ende); } @Override public ISM3 initSM3() { return new SydSM3(this); } @Override 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); } } }