T100738
2024-04-16 eeb86aaf2f73a02600195ce2637dde6caf858a88
commit
已修改5个文件
75 ■■■■■ 文件已修改
product-server-data-center/src/main/java/com/product/data/center/service/DataArchivingQueue.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-data-center/src/main/java/com/product/data/center/service/DataExtractService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-data-center/src/main/java/com/product/data/center/service/DataSyncService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-data-center/src/main/java/com/product/data/center/utils/CustomLock.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/resources/LicenseKey.dat 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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