三类模式写

This commit is contained in:
cheney
2022-09-08 16:18:39 +08:00
parent ce43b10cc6
commit c563ef91d3
9 changed files with 68 additions and 310 deletions
@@ -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);
}
@@ -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<Integer> 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<Boolean> 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;
}
}
@@ -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<Integer> 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<Boolean> 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;
}
}
@@ -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<String, String> SYD_SM3_Hash_LongData(byte[] pcData, int iPkgNum, String pcProcData) {
return null;
FutureTask<LongDataReturn<String, String>> task = Workers.getLongLinkWorks().fTask(new Callable<LongDataReturn<String, String>>() {
@Override
public LongDataReturn<String, String> 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;
}
@@ -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<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 = longLinkWorks.fTask(new Callable<List<byte[]>>() {
@Override
public List<byte[]> call() throws Exception {
return SydApiShortLink.super.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 = longLinkWorks.fTask(new Callable<String[]>() {
@Override
public String[] call() throws Exception {
return SydApiShortLink.super.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 = longLinkWorks.fTask(new Callable<boolean[]>() {
@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<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);
}
}
private static int[] toIntArray(List<Integer> 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<Boolean> 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;
}
}
@@ -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;
}
@@ -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;
@@ -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;