product-server-data-center/src/main/java/com/product/data/center/service/DataArchivingQueue.java
@@ -202,7 +202,7 @@ ExecutorService executorService = queryThreadMap.get(tableName); if (executorService != null) { if (!executorService.isShutdown()) { executorService.shutdown(); executorService.shutdownNow(); } queryThreadMap.remove(tableName); } product-server-data-center/src/main/java/com/product/data/center/service/DataExtractService.java
@@ -533,7 +533,7 @@ maybeUpdate.getData().sort((o1, o2) -> DateUtil.compare(o1.getDate(extractUpdateTimeField), o2.getDate(extractUpdateTimeField))); batchResultEntity = targetNewDao.updateBatch(maybeUpdate, updateFilterEntity, false); batchResultEntity = targetNewDao.updateBatch(maybeUpdate, updateFilterEntity, true); WriteExtractUtil.append("更新提取过滤后数据:" + extractTargetTable + ",需要更新的条数:" + maybeUpdate.getRows() + ",耗时:" + tempTestTimer2.intervalMs()); targetNewDao.closeConnection(); product-server-data-center/src/main/java/com/product/data/center/service/DataSyncService.java
@@ -132,8 +132,8 @@ if (syncInfo != null && !StringUtils.isEmpty(syncInfo.getString(CmnConst.TABLE_NAME))) { String tableName = syncInfo.getString(CmnConst.TABLE_NAME); baseDao.executeUpdate("UPDATE product_sys_data_center_log set deal_flag=?,deal_result=?,updated_utc_datetime=?" + " where type=3 and UPPER(other_info) like concat('%',UPPER(?),'%')" , new Object[]{1, count == lists.size() ? 1 : 0, new Date(), "\"table_name\":\"" + tableName + "\""}); " where type=3 and config_uuid in (select uuid from product_sys_data_sync_mes_sub where UPPER(table_name)=UPPER(?)) and (result=0 or deal_result=0)" , new Object[]{1, count == lists.size() ? 1 : 0, new Date(), tableName}); } } catch (Exception e) { e.printStackTrace(); @@ -157,6 +157,7 @@ String lockKey = null; Dao sourceDao = null; try { try { String tableName = jsonObject.getString(CmnConst.TABLE_NAME); String[] uniqueSignFieldName = (StringUtils.isEmpty(jsonObject.getString(CmnConst.UNIQUE_NAME)) ? "" : jsonObject.getString(CmnConst.UNIQUE_NAME)).split(","); if (ArrayUtil.isEmpty(uniqueSignFieldName)) { @@ -172,7 +173,7 @@ throw new BaseException(ErrorCode.SYNC_GET_CONFIG_FAIL); } lockKey = jsonObject.getString(CmnConst.TABLE_NAME); if (!customLock.tryLock(lockKey)) { if (!customLock.tryLock(lockKey, 120)) { syncDataLogEntity.setOtherInfo("该表数据同步已有任务在执行,跳过本次执行!"); journalEntities.add(getLogRecord(syncDataLogEntity, null, tableName, null, null, null, 0L)); @@ -466,6 +467,11 @@ } } } finally { if (lockStatus && !StringUtils.isEmpty(lockKey)) { customLock.unLock(lockKey); } } } private static String[] getUniqueValue(String value) { product-server-data-center/src/main/java/com/product/data/center/utils/CustomLock.java
@@ -1,11 +1,15 @@ package com.product.data.center.utils; import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.date.DateUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.ArrayUtil; import com.product.core.spring.context.SpringMVCContextHolder; import org.apache.commons.lang3.StringUtils; import javax.swing.*; import java.text.DateFormat; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -19,6 +23,7 @@ private Map<String, Long> obj = new ConcurrentHashMap<>(); private Map<String, Long> threadObj = new ConcurrentHashMap<>(); private long detectionWaitTime = 1000L; @@ -41,12 +46,64 @@ return this.tryLock(ArrayUtil.join(key, ",")); } public static void main(String[] args) { long timemillis = 1709654400039L; //转换为年月日时分秒 String format = DateUtil.format(DateUtil.date(timemillis), "yyyy-MM-dd HH:mm:ss"); System.out.println(format); } public boolean tryLock(String key, long timeoutMinute) { if (!StringUtils.isEmpty(key)) { key = key.toUpperCase(); synchronized (key.intern()) { if (!this.obj.containsKey(key)) { lock(key); //获取当前线程 long id = Thread.currentThread().getId(); threadObj.put(key, id); return true; } else if (timeoutMinute > 0) { //获取锁进入开始时间 long startTime = obj.get(key); //获取当前时间 long currentTime = System.currentTimeMillis(); //将分钟转换为毫秒 long timeout = timeoutMinute * 60 * 1000; //如果当前时间减去开始时间大于等于超时时间 if (currentTime - startTime >= timeout) { long threadId = threadObj.get(key); //根据线程id获取线程 Thread[] threads = ThreadUtil.getThreads(); for (Thread thread : threads) { if (thread.getId() == threadId) { //中断线程 ThreadUtil.interrupt(thread, true); SpringMVCContextHolder.getSystemLogger().error("线程:" + thread.getName() + "超时被中断"); return tryLock(key, timeoutMinute); } } return true; } } } } return false; } public boolean tryLock(String key) { if (!StringUtils.isEmpty(key)) { key = key.toUpperCase(); synchronized (key.intern()) { if (!this.obj.containsKey(key)) { lock(key); //获取当前线程 long id = Thread.currentThread().getId(); threadObj.put(key, id); return true; } } product-server-web/resources/LicenseKey.dat
@@ -1 +1 @@ 704F16B1D215BC04042005365EB2001E3324D7BEEBA9206CA1F670D493A7874D7C65C473EBDEBD0C0EF47C7DAA7F2BF77CAEEAD85E4F681748A2D3CD6A86DF628FF6A90AD4E28B7DA66B8EA0915E4F4DC5DAAC065A7B746CEE1E7533BE0918A4C79FBCDEA24B82014A01B6D8E3A52BBDAC3DAA66FE9FDE3E8D92ACB54DA1746779BBD63F16726C6330140ED5EF0D1974692C5AABA9DBB6BFE742983374187BC2C0BF118861E3A0D68EF1CCBA87CA33988FB2F40FEE7ACFF8952DDCAC47AD42976792F264AC0C6C90D698959D70638E1C38307B559BB540F0F978D3F8B663E7D59E4143B96D5A6C02E5D5086BA3858386E638D338AA4353193CF6FDCC122CF6D68768ACF82104FB2AFF7BC993427E0A2CBD0DD5F1BF735AAC085FB9987E6CA983DB4C45064137A400B6F3DA128276ED819B65241830F4C8B5E849C75F16C93A17B11FE7195A7DF875199562CBE01186A6F4E87FFFF487D09BB4D1887F23C681DB31D998DB659BD4CAB381937A188CEF2DAA2F7065D5A5D42D9697A6E6F00BA3E9 7BAAE941D97E32ED0D3DB709586097FA3A9BBF61E20398F7ACC5C04F94F9525779220CFCE69C6A5E051BD2CEA5DBBADC79D39E9A5CDC6CF341E3E8BF6169E62583CB5D82DF7AFE36A245D2159797065DC849C4B25650EA9BE02620B4B6C852BACD276A03ACE2795F4EFFBE2FE18D2501A16742D8FC728A488D162F544B9A66D07F223933170C022537C7833AE01614E76FB42ABEA383B9E8E5B2AAEA758FA433C6A79DC5625EC63180C83868891D03318B4D16D6ED6DE8729155B69F475768AE6805EEABA38645F2DE1D0CA57A48D1143932E32F9B3CCFF1F7D3E5A2B036027A91DE7DF36CDB626EE836B389A6DBE536E7C50EB8AD05B32A3A6262F91E18A53081BB06CD2A7C6DFEFD0CFAEF4453ECEBB410C36BB35CDCAE057869517C86ED83D0E2BAFE44219C47B9FA8C668A6F7EC29C9758C530EAAF91EB886F851010F2CBB7B5D64C5C52FEAD11C192EBEF09E629F7273461FE0B88A1B3FD7ADB226F3D9D3B75FA246BCAED37B981FB891C52AFFAA6DFB07ADEF8B9059DC55C20FF3C7829