同步方法修改以修复推送锁定问题

对`SoSaleOutPluginInitializerToB`和`SoSaleReturnPluginInitializerToB`中的方法进行同步修改,以解决在推送数据到U8C系统时潜在的并发问题。现在方法在执行数据推送及验证存在性之前会进行同步锁定,以防止多线程环境下的数据冲突。

同时,在`SoSaleOutPluginInitializerToBTest`中对测试代码进行了注释调整,以反映代码变更后的测试情况。

此次更改确保了在并发环境下,数据推送和验证操作的原子性,从而提高了系统稳定性和数据一致性。
This commit is contained in:
liuy 2024-09-26 17:38:45 +08:00
parent 55b1df7d3c
commit e807d334fc
3 changed files with 54 additions and 43 deletions

View File

@ -395,18 +395,20 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* @author liuyang
*/
private List<HeaderDetailsDto> filterDataStock(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
// List<com.hzya.frame.ttxofs.dto.ofssaleorderoutsearch.HeaderDetailsDto> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>();
if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) {
List<List<HeaderDetailsDto>> splitListByCount = SplitListByCountUtil.splitListByCount(headerDetailsDtoList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<HeaderDetailsDto> headerDetailsDtoList2 = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(headerDetailsDtoList2);
List<TocofsSaleoutDetailedEntity> tocofsSaleoutDetailedEntityList = queryStockTocOutLog(idStr);
allTocofsSaleoutDetailedEntityList.addAll(tocofsSaleoutDetailedEntityList);
synchronized (PUSH_LOCK1) {
// List<com.hzya.frame.ttxofs.dto.ofssaleorderoutsearch.HeaderDetailsDto> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>();
if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) {
List<List<HeaderDetailsDto>> splitListByCount = SplitListByCountUtil.splitListByCount(headerDetailsDtoList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<HeaderDetailsDto> headerDetailsDtoList2 = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(headerDetailsDtoList2);
List<TocofsSaleoutDetailedEntity> tocofsSaleoutDetailedEntityList = queryStockTocOutLog(idStr);
allTocofsSaleoutDetailedEntityList.addAll(tocofsSaleoutDetailedEntityList);
}
}
return filterDataRowsAsPushOrFailedStock(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList);
}
return filterDataRowsAsPushOrFailedStock(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList);
}
/**
@ -509,17 +511,19 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* @author liuyang
*/
private List<HeaderDetailsDto> filterDataTran(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>();
if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) {
List<List<HeaderDetailsDto>> splitListByCount = SplitListByCountUtil.splitListByCount(headerDetailsDtoList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<HeaderDetailsDto> headerDetailsDtoList2 = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(headerDetailsDtoList2);
List<TocofsSaleoutDetailedEntity> tocofsSaleoutDetailedEntityList = queryStockTocOutLog(idStr);
allTocofsSaleoutDetailedEntityList.addAll(tocofsSaleoutDetailedEntityList);
synchronized (PUSH_LOCK2) {
List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>();
if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) {
List<List<HeaderDetailsDto>> splitListByCount = SplitListByCountUtil.splitListByCount(headerDetailsDtoList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<HeaderDetailsDto> headerDetailsDtoList2 = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(headerDetailsDtoList2);
List<TocofsSaleoutDetailedEntity> tocofsSaleoutDetailedEntityList = queryStockTocOutLog(idStr);
allTocofsSaleoutDetailedEntityList.addAll(tocofsSaleoutDetailedEntityList);
}
}
return filterDataRowsAsPushOrFailedTran(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList);
}
return filterDataRowsAsPushOrFailedTran(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList);
}
/**
@ -1894,7 +1898,7 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
Map<String, List<SalesInvoiceDto>> stringListMap = new HashMap<>();
stringListMap.put("billvos", salesInvoiceDtoList);
//推送到U8C之前再次验证在U8C是否已经存在
synchronized (PUSH_LOCK2) {
Boolean aBoolean = checkTobSalesInvoice(header.getId(), header.getCode());
@ -2062,9 +2066,10 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* @author liuyang
*/
private Boolean checkTobOrder(String ofsId, String ofsCode) throws Exception {
Assert.notNull(ofsId, "ofsId不能为空");
Assert.notNull(ofsCode, "ofsCode不能为空");
synchronized (checkTobOrderLock) {
Assert.notNull(ofsId, "ofsId不能为空");
Assert.notNull(ofsCode, "ofsCode不能为空");
SoSaleEntity soSaleEntity = new SoSaleEntity();
soSaleEntity.setDr(0L);
soSaleEntity.setDataSourceCode("lets_u8c");

View File

@ -403,18 +403,20 @@ public class SoSaleReturnPluginInitializerToB extends PluginBaseEntity {
* @author liuyang
*/
private List<StockinOrderSearchResponse.StockinOrder> filterDataStock(List<StockinOrderSearchResponse.StockinOrder> returnGoodHeaderDetailsDataDtoArrayList) throws Exception {
// List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>();
if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) {
List<List<StockinOrderSearchResponse.StockinOrder>> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoArrayList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<StockinOrderSearchResponse.StockinOrder> stockinOrderList = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(stockinOrderList);
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntities = queryStockTocOutLog(idStr);
tocofsReturngoodsDetailedEntityList.addAll(tocofsReturngoodsDetailedEntities);
synchronized (PUSH_LOCK1) {
// List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>();
if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) {
List<List<StockinOrderSearchResponse.StockinOrder>> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoArrayList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<StockinOrderSearchResponse.StockinOrder> stockinOrderList = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(stockinOrderList);
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntities = queryStockTocOutLog(idStr);
tocofsReturngoodsDetailedEntityList.addAll(tocofsReturngoodsDetailedEntities);
}
}
return filterDataRowsAsPushOrFailedStock(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList);
}
return filterDataRowsAsPushOrFailedStock(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList);
}
/**
@ -567,18 +569,20 @@ public class SoSaleReturnPluginInitializerToB extends PluginBaseEntity {
* @author liuyang
*/
private List<StockinOrderSearchResponse.StockinOrder> filterDataTran(List<StockinOrderSearchResponse.StockinOrder> returnGoodHeaderDetailsDataDtoArrayList) throws Exception {
// List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>();
if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) {
List<List<StockinOrderSearchResponse.StockinOrder>> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoArrayList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<StockinOrderSearchResponse.StockinOrder> stockinOrderList = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(stockinOrderList);
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntities = queryStockTocOutLog(idStr);
tocofsReturngoodsDetailedEntityList.addAll(tocofsReturngoodsDetailedEntities);
synchronized (PUSH_LOCK2) {
// List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>();
if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) {
List<List<StockinOrderSearchResponse.StockinOrder>> splitListByCount = SplitListByCountUtil.splitListByCount(returnGoodHeaderDetailsDataDtoArrayList, 100);
for (int i = 0; i < splitListByCount.size(); i++) {
List<StockinOrderSearchResponse.StockinOrder> stockinOrderList = splitListByCount.get(i);
String idStr = commaConcatenatedPrimaryKeyStock(stockinOrderList);
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntities = queryStockTocOutLog(idStr);
tocofsReturngoodsDetailedEntityList.addAll(tocofsReturngoodsDetailedEntities);
}
}
return filterDataRowsAsPushOrFailedTran(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList);
}
return filterDataRowsAsPushOrFailedTran(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList);
}
/**

View File

@ -62,7 +62,9 @@ public class SoSaleOutPluginInitializerToBTest {
try {
// soSaleOutPluginInitializerToB.startImplementByTranTime("2024-09-12 14:04:00","2024-09-12 14:12:00");
soSaleOutPluginInitializerToB.startImplementByCode("LETS-SH2024092000000003", "stock");
// soSaleOutPluginInitializerToB.startImplementByCode("LETS-SH2024092000000003", "stock");
soSaleOutPluginInitializerToB.startImplementByCode("LETS-SH2024092600000009","stock");
} catch (Exception e) {
e.printStackTrace();
}