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

对`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,6 +395,7 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* @author liuyang * @author liuyang
*/ */
private List<HeaderDetailsDto> filterDataStock(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception { private List<HeaderDetailsDto> filterDataStock(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
synchronized (PUSH_LOCK1) {
// List<com.hzya.frame.ttxofs.dto.ofssaleorderoutsearch.HeaderDetailsDto> headerDetailsDtoList1 = new ArrayList<>(); // List<com.hzya.frame.ttxofs.dto.ofssaleorderoutsearch.HeaderDetailsDto> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>(); List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>();
if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) { if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) {
@ -408,6 +409,7 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
} }
return filterDataRowsAsPushOrFailedStock(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList); return filterDataRowsAsPushOrFailedStock(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList);
} }
}
/** /**
* 逗号拼接字符串主键作为批处理的一部分方便下一步的批量查询操作 * 逗号拼接字符串主键作为批处理的一部分方便下一步的批量查询操作
@ -509,6 +511,7 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* @author liuyang * @author liuyang
*/ */
private List<HeaderDetailsDto> filterDataTran(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception { private List<HeaderDetailsDto> filterDataTran(List<HeaderDetailsDto> headerDetailsDtoList) throws Exception {
synchronized (PUSH_LOCK2) {
List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>(); List<TocofsSaleoutDetailedEntity> allTocofsSaleoutDetailedEntityList = new ArrayList<>();
if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) { if (headerDetailsDtoList != null && headerDetailsDtoList.size() > 0) {
List<List<HeaderDetailsDto>> splitListByCount = SplitListByCountUtil.splitListByCount(headerDetailsDtoList, 100); List<List<HeaderDetailsDto>> splitListByCount = SplitListByCountUtil.splitListByCount(headerDetailsDtoList, 100);
@ -521,6 +524,7 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
} }
return filterDataRowsAsPushOrFailedTran(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList); return filterDataRowsAsPushOrFailedTran(allTocofsSaleoutDetailedEntityList, headerDetailsDtoList);
} }
}
/** /**
* 筛选出未推送或者失败的数据行 * 筛选出未推送或者失败的数据行
@ -2062,9 +2066,10 @@ public class SoSaleOutPluginInitializerToB extends PluginBaseEntity {
* @author liuyang * @author liuyang
*/ */
private Boolean checkTobOrder(String ofsId, String ofsCode) throws Exception { private Boolean checkTobOrder(String ofsId, String ofsCode) throws Exception {
synchronized (checkTobOrderLock) {
Assert.notNull(ofsId, "ofsId不能为空"); Assert.notNull(ofsId, "ofsId不能为空");
Assert.notNull(ofsCode, "ofsCode不能为空"); Assert.notNull(ofsCode, "ofsCode不能为空");
synchronized (checkTobOrderLock) {
SoSaleEntity soSaleEntity = new SoSaleEntity(); SoSaleEntity soSaleEntity = new SoSaleEntity();
soSaleEntity.setDr(0L); soSaleEntity.setDr(0L);
soSaleEntity.setDataSourceCode("lets_u8c"); soSaleEntity.setDataSourceCode("lets_u8c");

View File

@ -403,6 +403,7 @@ public class SoSaleReturnPluginInitializerToB extends PluginBaseEntity {
* @author liuyang * @author liuyang
*/ */
private List<StockinOrderSearchResponse.StockinOrder> filterDataStock(List<StockinOrderSearchResponse.StockinOrder> returnGoodHeaderDetailsDataDtoArrayList) throws Exception { private List<StockinOrderSearchResponse.StockinOrder> filterDataStock(List<StockinOrderSearchResponse.StockinOrder> returnGoodHeaderDetailsDataDtoArrayList) throws Exception {
synchronized (PUSH_LOCK1) {
// List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>(); // List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>(); List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>();
if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) { if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) {
@ -416,6 +417,7 @@ public class SoSaleReturnPluginInitializerToB extends PluginBaseEntity {
} }
return filterDataRowsAsPushOrFailedStock(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList); return filterDataRowsAsPushOrFailedStock(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList);
} }
}
/** /**
* 筛选出未推送或者失败的数据行过滤库存同步业务 * 筛选出未推送或者失败的数据行过滤库存同步业务
@ -567,6 +569,7 @@ public class SoSaleReturnPluginInitializerToB extends PluginBaseEntity {
* @author liuyang * @author liuyang
*/ */
private List<StockinOrderSearchResponse.StockinOrder> filterDataTran(List<StockinOrderSearchResponse.StockinOrder> returnGoodHeaderDetailsDataDtoArrayList) throws Exception { private List<StockinOrderSearchResponse.StockinOrder> filterDataTran(List<StockinOrderSearchResponse.StockinOrder> returnGoodHeaderDetailsDataDtoArrayList) throws Exception {
synchronized (PUSH_LOCK2) {
// List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>(); // List<StockinOrderSearchResponse.StockinOrder> headerDetailsDtoList1 = new ArrayList<>();
List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>(); List<TocofsReturngoodsDetailedEntity> tocofsReturngoodsDetailedEntityList = new ArrayList<>();
if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) { if (returnGoodHeaderDetailsDataDtoArrayList != null && returnGoodHeaderDetailsDataDtoArrayList.size() > 0) {
@ -580,6 +583,7 @@ public class SoSaleReturnPluginInitializerToB extends PluginBaseEntity {
} }
return filterDataRowsAsPushOrFailedTran(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList); return filterDataRowsAsPushOrFailedTran(tocofsReturngoodsDetailedEntityList, returnGoodHeaderDetailsDataDtoArrayList);
} }
}
/** /**
* 保存抓取到的数据到mysql底表如果底表里已经存在则会忽略 * 保存抓取到的数据到mysql底表如果底表里已经存在则会忽略

View File

@ -62,7 +62,9 @@ public class SoSaleOutPluginInitializerToBTest {
try { try {
// soSaleOutPluginInitializerToB.startImplementByTranTime("2024-09-12 14:04:00","2024-09-12 14:12:00"); // 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) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }