376 lines
13 KiB
Java
376 lines
13 KiB
Java
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<String> task = builder.getLongLinkWorks().fTask(new Callable<String>() {
|
|
@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<String, String> SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) {
|
|
FutureTask<LongDataReturn<String, String>> task = builder.getLongLinkWorks().fTask(new Callable<LongDataReturn<String, String>>() {
|
|
@Override
|
|
public LongDataReturn<String, String> 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<byte[]> task = builder.getLongLinkWorks().fTask(new Callable<byte[]>() {
|
|
@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<byte[]> task = builder.getLongLinkWorks().fTask(new Callable<byte[]>() {
|
|
@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<String, String> SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData) {
|
|
FutureTask<LongDataReturn<String, String>> task = builder.getLongLinkWorks().fTask(new Callable<LongDataReturn<String, String>>() {
|
|
@Override
|
|
public LongDataReturn<String, String> 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<String, Boolean> SYD_SM4Mac_LongData(int iKeyIndex, byte[] pcData, int iPkgNum, String pcProcData, String pcMac) {
|
|
FutureTask<LongDataReturn<String, Boolean>> task = builder.getLongLinkWorks().fTask(new Callable<LongDataReturn<String, Boolean>>() {
|
|
@Override
|
|
public LongDataReturn<String, Boolean> 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<String> task = builder.getLongLinkWorks().fTask(new Callable<String>() {
|
|
@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<Boolean> task = builder.getLongLinkWorks().fTask(new Callable<Boolean>() {
|
|
@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<byte[]> SYD_SM4_BatchData(int[] iKeyIndex, List<byte[]> pcData, int iFlag) {
|
|
// 将数据进行分组,防止超长。
|
|
List<List<byte[]>> dataGroups = new ArrayList<>();
|
|
List<List<Integer>> keyGroups = new ArrayList<>();
|
|
int totalLen = 0;
|
|
|
|
List<byte[]> curDataGroup = new ArrayList<>();
|
|
List<Integer> 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<FutureTask<List<byte[]>>> tasks = new ArrayList<>();
|
|
for (int i = 0; i < dataGroups.size(); i++) {
|
|
|
|
int finalI = i;
|
|
FutureTask<List<byte[]>> task = builder.getLongLinkWorks().fTask(new Callable<List<byte[]>>() {
|
|
@Override
|
|
public List<byte[]> 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<byte[]> ret = new ArrayList<>();
|
|
for (FutureTask<List<byte[]>> 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<byte[]> pcData) {
|
|
// 将数据进行分组,防止超长。
|
|
List<List<byte[]>> dataGroups = new ArrayList<>();
|
|
List<List<Integer>> keyGroups = new ArrayList<>();
|
|
int totalLen = 0;
|
|
|
|
List<byte[]> curDataGroup = new ArrayList<>();
|
|
List<Integer> 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<FutureTask<String[]>> tasks = new ArrayList<>();
|
|
for (int i = 0; i < dataGroups.size(); i++) {
|
|
|
|
int finalI = i;
|
|
FutureTask<String[]> task = builder.getLongLinkWorks().fTask(new Callable<String[]>() {
|
|
@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<String> ret = new ArrayList<>();
|
|
for (FutureTask<String[]> 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<byte[]> pcData, String[] pcMac) {
|
|
// 将数据进行分组,防止超长。
|
|
List<List<byte[]>> dataGroups = new ArrayList<>();
|
|
List<List<Integer>> keyGroups = new ArrayList<>();
|
|
List<List<String>> macGroups = new ArrayList<>();
|
|
int totalLen = 0;
|
|
|
|
List<byte[]> curDataGroup = new ArrayList<>();
|
|
List<Integer> curKeyGroup = new ArrayList<>();
|
|
List<String> 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<FutureTask<boolean[]>> tasks = new ArrayList<>();
|
|
for (int i = 0; i < dataGroups.size(); i++) {
|
|
|
|
int finalI = i;
|
|
FutureTask<boolean[]> task = builder.getLongLinkWorks().fTask(new Callable<boolean[]>() {
|
|
@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<Boolean> ret = new ArrayList<>();
|
|
for (FutureTask<boolean[]> t : tasks) {
|
|
boolean[] rets = t.get();
|
|
for (boolean r : rets) {
|
|
ret.add(r);
|
|
}
|
|
}
|
|
return toBoolArray(ret);
|
|
|
|
} catch (Exception e) {
|
|
throw new SydApiException("并行任务执行失败", 0xC101, e);
|
|
}
|
|
}
|
|
}
|