From 10f8e8251bc42442c2c86e259b154b1349191211 Mon Sep 17 00:00:00 2001 From: xuelijun <977662702@qq.com> Date: Tue, 15 Jul 2025 10:04:16 +0800 Subject: [PATCH 1/2] canal --- logs/infra-server.log.2025-06-12.0.gz | Bin 0 -> 3259 bytes logs/infra-server.log.2025-06-13.0.gz | Bin 0 -> 6993 bytes tashow-framework/pom.xml | 1 + tashow-framework/tashow-data-canal/pom.xml | 49 +++++ .../canal/config/CanalAutoConfiguration.java | 22 ++ .../cloud/canal/service/CanalSyncService.java | 188 ++++++++++++++++ .../canal/service/CanalSyncServiceTest.java | 156 ++++++++++++++ .../tashow/cloud/canal/service/Canaldb.java | 27 +++ .../canal/service/SqlExecutorService.java | 56 +++++ .../tashow/cloud/canal/service/SqlTask.java | 19 ++ .../cloud/canal/service/SqlTaskQueue.java | 32 +++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + tashow-module/tashow-module-infra/pom.xml | 15 ++ .../cloud/infra/framework/CanalClient.java | 204 ++++++++++++++++++ .../src/main/resources/application-local.yaml | 5 +- 15 files changed, 773 insertions(+), 2 deletions(-) create mode 100644 logs/infra-server.log.2025-06-12.0.gz create mode 100644 logs/infra-server.log.2025-06-13.0.gz create mode 100644 tashow-framework/tashow-data-canal/pom.xml create mode 100644 tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/config/CanalAutoConfiguration.java create mode 100644 tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncService.java create mode 100644 tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncServiceTest.java create mode 100644 tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/Canaldb.java create mode 100644 tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlExecutorService.java create mode 100644 tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTask.java create mode 100644 tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTaskQueue.java create mode 100644 tashow-framework/tashow-data-canal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/CanalClient.java diff --git a/logs/infra-server.log.2025-06-12.0.gz b/logs/infra-server.log.2025-06-12.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..8d54b58c9f1ee704489cbc33bf7f630043d31d65 GIT binary patch literal 3259 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 literal 0 HcmV?d00001 diff --git a/logs/infra-server.log.2025-06-13.0.gz b/logs/infra-server.log.2025-06-13.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..605b537d38c07c320ffe78d6fff5479bb3f83306 GIT binary patch literal 6993 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 E00Y;OP5=M^ literal 0 HcmV?d00001 diff --git a/tashow-framework/pom.xml b/tashow-framework/pom.xml index 0e47e10..06d6854 100644 --- a/tashow-framework/pom.xml +++ b/tashow-framework/pom.xml @@ -27,6 +27,7 @@ tashow-data-redis tashow-data-excel tashow-data-es + tashow-data-canal diff --git a/tashow-framework/tashow-data-canal/pom.xml b/tashow-framework/tashow-data-canal/pom.xml new file mode 100644 index 0000000..f3daf9d --- /dev/null +++ b/tashow-framework/tashow-data-canal/pom.xml @@ -0,0 +1,49 @@ + + + 4.0.0 + + com.tashow.cloud + tashow-framework + ${revision} + + tashow-data-canal + jar + + ${project.artifactId} + canal 封装拓展 + + + + com.alibaba.otter + canal.client + 1.1.0 + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + 4.2.0 + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + com.tashow.cloud + tashow-common + + + + + org.projectlombok + lombok + true + + + diff --git a/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/config/CanalAutoConfiguration.java b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/config/CanalAutoConfiguration.java new file mode 100644 index 0000000..038eedd --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/config/CanalAutoConfiguration.java @@ -0,0 +1,22 @@ +package com.tashow.cloud.canal.config; + +import com.tashow.cloud.canal.service.CanalSyncService; +import com.tashow.cloud.canal.service.SqlExecutorService; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@AutoConfiguration +public class CanalAutoConfiguration { + + @Bean + public CanalSyncService canalSyncService() { + return new CanalSyncService(); + } + + @Bean + public SqlExecutorService getdb() { + return new SqlExecutorService(); + } +} diff --git a/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncService.java b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncService.java new file mode 100644 index 0000000..64c6a87 --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncService.java @@ -0,0 +1,188 @@ +package com.tashow.cloud.canal.service; + +import com.alibaba.otter.canal.client.CanalConnector; +import com.alibaba.otter.canal.client.CanalConnectors; +import com.alibaba.otter.canal.protocol.CanalEntry.*; +import com.alibaba.otter.canal.protocol.Message; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.BatchPreparedStatementSetter; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.net.InetSocketAddress; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.ConcurrentLinkedQueue; + +@Service +public class CanalSyncService { + + private static final Logger log = LoggerFactory.getLogger(CanalSyncService.class); + + private static final Queue SQL_QUEUE = new ConcurrentLinkedQueue<>(); + + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private SqlExecutorService sqlExecutorService; + + @PostConstruct + public void start() { + new Thread(this::runCanalClient).start(); + } + + private void runCanalClient() { + CanalConnector connector = CanalConnectors.newSingleConnector( + new InetSocketAddress("43.139.42.137", 11111), + "example", + "", + "" + ); + int batchSize = 1000; + + try { + connector.connect(); + connector.subscribe("tashow-platform\\..*"); + connector.rollback(); + + while (true) { + Message message = connector.getWithoutAck(batchSize); + log.info("Received message id: {}, entries size: {}", message.getId(), message.getEntries().size()); + long batchId = message.getId(); + int size = message.getEntries().size(); + + if (batchId == -1 || size == 0) { + Thread.sleep(1000); + continue; + } + + dataHandle(message.getEntries()); + connector.ack(batchId); + + if (!SQL_QUEUE.isEmpty()) { + executeQueueSql(); + } + } + } catch (Exception e) { + log.error("Canal client error occurred.", e); + } finally { + connector.disconnect(); + } + } + + private void dataHandle(List entries) { + for (Entry entry : entries) { + if (entry.getEntryType() != EntryType.ROWDATA) continue; + + try { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + EventType eventType = rowChange.getEventType(); + String schemaName = entry.getHeader().getSchemaName(); + String tableName = entry.getHeader().getTableName(); + + log.info("schema: {}, table: {}, type: {}", schemaName, tableName, eventType); + + if (eventType == EventType.DELETE) { + saveDeleteSql(entry); + } else if (eventType == EventType.UPDATE) { + saveUpdateSql(entry); + } else if (eventType == EventType.INSERT) { + saveInsertSql(entry); + } + + } catch (Exception e) { + log.error("Error handling entry: {}", entry.toString(), e); + } + } + } + + private void saveInsertSql(Entry entry) throws Exception { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + String tableName = entry.getHeader().getTableName(); + + for (RowData rowData : rowChange.getRowDatasList()) { + List columns = rowData.getAfterColumnsList(); + + List columnNames = new ArrayList<>(); + List values = new ArrayList<>(); + + for (Column col : columns) { + columnNames.add(col.getName()); + values.add(col.getValue()); + } + + String sql = "INSERT INTO " + tableName + " (" + + String.join(",", columnNames) + ") VALUES ("; + + StringBuilder placeholders = new StringBuilder(); + for (int i = 0; i < values.size(); i++) { + placeholders.append("?,"); + } + if (placeholders.length() > 0) placeholders.deleteCharAt(placeholders.length() - 1); + sql += placeholders + ")"; + + SQL_QUEUE.add(new SqlTask(sql, values.toArray())); + } + } + + private void saveUpdateSql(Entry entry) throws Exception { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + String tableName = entry.getHeader().getTableName(); + + for (RowData rowData : rowChange.getRowDatasList()) { + List newColumns = rowData.getAfterColumnsList(); + List oldColumns = rowData.getBeforeColumnsList(); + + List updateColumns = new ArrayList<>(); + List params = new ArrayList<>(); + + for (Column col : newColumns) { + updateColumns.add(col.getName() + "=?"); + params.add(col.getValue()); + } + + Optional primaryKeyOpt = oldColumns.stream().filter(Column::getIsKey).findFirst(); + Column primaryKey = primaryKeyOpt.orElseThrow(() -> new RuntimeException("未找到主键")); + + params.add(primaryKey.getValue()); + + String sql = "UPDATE " + tableName + " SET " + + String.join(",", updateColumns) + + " WHERE " + primaryKey.getName() + "=?"; + + SQL_QUEUE.add(new SqlTask(sql, params.toArray())); + } + } + + private void saveDeleteSql(Entry entry) throws Exception { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + String tableName = entry.getHeader().getTableName(); + + for (RowData rowData : rowChange.getRowDatasList()) { + List beforeColumns = rowData.getBeforeColumnsList(); + + Optional primaryKeyOpt = beforeColumns.stream().filter(Column::getIsKey).findFirst(); + Column primaryKey = primaryKeyOpt.orElseThrow(() -> new RuntimeException("未找到主键")); + + String sql = "DELETE FROM " + tableName + " WHERE " + primaryKey.getName() + "=?"; + SQL_QUEUE.add(new SqlTask(sql, primaryKey.getValue())); + } + } + + private void executeQueueSql() { + List tasks = new ArrayList<>(); + SqlTask task; + while ((task = SQL_QUEUE.poll()) != null) { + tasks.add(task); + } + if (!tasks.isEmpty()) { + sqlExecutorService.executeBatch(tasks); + } + } +} \ No newline at end of file diff --git a/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncServiceTest.java b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncServiceTest.java new file mode 100644 index 0000000..9a526da --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/CanalSyncServiceTest.java @@ -0,0 +1,156 @@ +/* +package com.tashow.cloud.canal.service; + +import com.alibaba.otter.canal.client.CanalConnector; +import com.alibaba.otter.canal.client.CanalConnectors; +import com.alibaba.otter.canal.protocol.CanalEntry.*; +import com.alibaba.otter.canal.protocol.Message; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.net.InetSocketAddress; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +@Service +public class CanalSyncServiceTest { + + private static final Queue SQL_QUEUE = new ConcurrentLinkedQueue<>(); + @Autowired + private JdbcTemplate jdbcTemplate; + @Autowired + private Canaldb canaldb; + + @PostConstruct + public void start() { + new Thread(this::runCanalClient).start(); + } + + private void runCanalClient() { + CanalConnector connector = CanalConnectors.newSingleConnector( + new InetSocketAddress("43.139.42.137", 11111), + "example", + "", + "" + ); + int batchSize = 1000; + + try { + connector.connect(); + connector.subscribe("tashow-platform\\..*"); + connector.rollback(); + + while (true) { + Message message = connector.getWithoutAck(batchSize); + System.out.println("Received message id: " + message.getId() + ", entries size: " + message.getEntries().size()); + long batchId = message.getId(); + int size = message.getEntries().size(); + + if (batchId == -1 || size == 0) { + Thread.sleep(1000); + continue; + } + + dataHandle(message.getEntries()); + connector.ack(batchId); + + if (SQL_QUEUE.size() > 0) { + executeQueueSql(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + connector.disconnect(); + } + } + + private void dataHandle(List entries) { + for (Entry entry : entries) { + if (entry.getEntryType() != EntryType.ROWDATA) continue; + + try { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + EventType eventType = rowChange.getEventType(); + String schemaName = entry.getHeader().getSchemaName(); + String tableName = entry.getHeader().getTableName(); + + System.out.println("schema: " + schemaName + ", table: " + tableName + ", type: " + eventType); + + if (eventType == EventType.DELETE) { + saveDeleteSql(entry); + } else if (eventType == EventType.UPDATE) { + saveUpdateSql(entry); + } else if (eventType == EventType.INSERT) { + saveInsertSql(entry); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private void saveInsertSql(Entry entry) throws Exception { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + for (RowData rowData : rowChange.getRowDatasList()) { + List columns = rowData.getAfterColumnsList(); + StringBuilder sql = new StringBuilder("INSERT INTO ") + .append(entry.getHeader().getTableName()).append(" (") + .append(columns.stream().map(Column::getName).reduce((a, b) -> a + "," + b).orElse("")) + .append(") VALUES (") + .append(columns.stream().map(c -> "'" + c.getValue() + "'").reduce((a, b) -> a + "," + b).orElse("")) + .append(");"); + + SQL_QUEUE.add(sql.toString()); + } + } + + private void saveUpdateSql(Entry entry) throws Exception { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + for (RowData rowData : rowChange.getRowDatasList()) { + List newColumns = rowData.getAfterColumnsList(); + List oldColumns = rowData.getBeforeColumnsList(); + + StringBuilder setClause = new StringBuilder(); + for (Column col : newColumns) { + setClause.append(col.getName()).append("='").append(col.getValue()).append("', "); + } + if (setClause.length() > 0) setClause.setLength(setClause.length() - 2); + + String whereClause = oldColumns.stream() + .filter(Column::getIsKey) + .map(c -> c.getName() + "='" + c.getValue() + "'") + .findFirst() + .orElseThrow(() -> new RuntimeException("未找到主键")); + + SQL_QUEUE.add("UPDATE " + entry.getHeader().getTableName() + " SET " + setClause + " WHERE " + whereClause + ";"); + } + } + + private void saveDeleteSql(Entry entry) throws Exception { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + for (RowData rowData : rowChange.getRowDatasList()) { + String whereClause = rowData.getBeforeColumnsList().stream() + .filter(Column::getIsKey) + .map(c -> c.getName() + "='" + c.getValue() + "'") + .findFirst() + .orElseThrow(() -> new RuntimeException("未找到主键")); + + SQL_QUEUE.add("DELETE FROM " + entry.getHeader().getTableName() + " WHERE " + whereClause + ";"); + } + } + + + private void executeQueueSql() { + int size = SQL_QUEUE.size(); + for (int i = 0; i < size; i++) { + String sql = SQL_QUEUE.poll(); + canaldb.execute(sql); + } + } +} +*/ diff --git a/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/Canaldb.java b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/Canaldb.java new file mode 100644 index 0000000..7b51600 --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/Canaldb.java @@ -0,0 +1,27 @@ +/* +package com.tashow.cloud.canal.service; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class Canaldb { + + @Autowired + private JdbcTemplate jdbcTemplate; + @DS("slave") + public void execute(String sql) { + try { + String ds = DynamicDataSourceContextHolder.peek(); // 调试查看当前数据源 + System.out.println("当前数据源:" + ds); + System.out.println("[execute]----> " + sql); + jdbcTemplate.execute(sql); + } catch (Exception e) { + e.printStackTrace(); + } + } +} +*/ diff --git a/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlExecutorService.java b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlExecutorService.java new file mode 100644 index 0000000..3ba0286 --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlExecutorService.java @@ -0,0 +1,56 @@ +package com.tashow.cloud.canal.service; + + +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.BatchPreparedStatementSetter; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +@Service +public class SqlExecutorService { + + private static final Logger log = LoggerFactory.getLogger(SqlExecutorService.class); + + @Autowired + private JdbcTemplate jdbcTemplate; + + public void executeBatch(List tasks) { + if (tasks == null || tasks.isEmpty()) return; + + DynamicDataSourceContextHolder.push("slave"); + try { + // 提取所有 SQL 模板(假设它们都是一样的) + String sqlTemplate = tasks.get(0).getSql(); + + // 执行批量更新 + jdbcTemplate.batchUpdate(sqlTemplate, new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + SqlTask task = tasks.get(i); + Object[] args = task.getArgs(); + for (int j = 0; j < args.length; j++) { + ps.setObject(j + 1, args[j]); + } + } + + @Override + public int getBatchSize() { + return tasks.size(); + } + }); + + log.info("✅ 成功执行 {} 条 SQL", tasks.size()); + } catch (Exception e) { + log.error("❌ 批量执行 SQL 失败", e); + } finally { + DynamicDataSourceContextHolder.poll(); + } + } +} \ No newline at end of file diff --git a/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTask.java b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTask.java new file mode 100644 index 0000000..c6f62c2 --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTask.java @@ -0,0 +1,19 @@ +package com.tashow.cloud.canal.service; + +public class SqlTask { + private final String sql; + private final Object[] args; + + public SqlTask(String sql, Object... args) { + this.sql = sql; + this.args = args; + } + + public String getSql() { + return sql; + } + + public Object[] getArgs() { + return args; + } +} \ No newline at end of file diff --git a/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTaskQueue.java b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTaskQueue.java new file mode 100644 index 0000000..edf2489 --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/java/com/tashow/cloud/canal/service/SqlTaskQueue.java @@ -0,0 +1,32 @@ +package com.tashow.cloud.canal.service; + +import java.util.List; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +public class SqlTaskQueue { + private static final Queue queue = new ConcurrentLinkedQueue<>(); + + public static void add(SqlTask task) { + queue.add(task); + } + + public static boolean isEmpty() { + return queue.isEmpty(); + } + + public static SqlTask poll() { + return queue.poll(); + } + + public static int size() { + return queue.size(); + } + + public static List drainAll() { + List list = new java.util.ArrayList<>(); + queue.forEach(list::add); + queue.clear(); + return list; + } +} diff --git a/tashow-framework/tashow-data-canal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/tashow-framework/tashow-data-canal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..361a8ce --- /dev/null +++ b/tashow-framework/tashow-data-canal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.tashow.cloud.canal.config.CanalAutoConfiguration \ No newline at end of file diff --git a/tashow-module/tashow-module-infra/pom.xml b/tashow-module/tashow-module-infra/pom.xml index 9d6c752..bf2006d 100644 --- a/tashow-module/tashow-module-infra/pom.xml +++ b/tashow-module/tashow-module-infra/pom.xml @@ -37,6 +37,14 @@ ${revision} + + + com.alibaba.otter + canal.client + 1.1.0 + + + com.tashow.cloud @@ -69,6 +77,13 @@ tashow-data-redis + + com.tashow.cloud + tashow-data-canal + 1.0.0 + compile + + com.tashow.cloud diff --git a/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/CanalClient.java b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/CanalClient.java new file mode 100644 index 0000000..95a6876 --- /dev/null +++ b/tashow-module/tashow-module-infra/src/main/java/com/tashow/cloud/infra/framework/CanalClient.java @@ -0,0 +1,204 @@ +package com.tashow.cloud.infra.framework; + + +import com.alibaba.otter.canal.client.CanalConnector; +import com.alibaba.otter.canal.client.CanalConnectors; +import com.alibaba.otter.canal.protocol.CanalEntry.*; +import com.alibaba.otter.canal.protocol.Message; +import com.google.protobuf.InvalidProtocolBufferException; +import org.springframework.stereotype.Component; + +import java.net.InetSocketAddress; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +@Component +public class CanalClient { + + //sql队列 + private Queue SQL_QUEUE = new ConcurrentLinkedQueue<>(); + + + /** + * canal入库方法 + */ + public void run() { + CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("43.139.42.137", + 11111), "example", "", ""); + int batchSize = 1000; + try { + connector.connect(); + // connector.subscribe(".*\\..*"); + connector.subscribe("tashow-platform"); + + connector.rollback(); + try { + while (true) { + //尝试从master那边拉去数据batchSize条记录,有多少取多少 + Message message = connector.getWithoutAck(batchSize); + long batchId = message.getId(); + int size = message.getEntries().size(); + if (batchId == -1 || size == 0) { + Thread.sleep(1000); + } else { + dataHandle(message.getEntries()); + } + connector.ack(batchId); + + //当队列里面堆积的sql大于一定数值的时候就模拟执行 + if (SQL_QUEUE.size() >= 1) { + executeQueueSql(); + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (InvalidProtocolBufferException e) { + e.printStackTrace(); + } + } finally { + connector.disconnect(); + } + } + + /** + * 模拟执行队列里面的sql语句 + */ + public void executeQueueSql() { + int size = SQL_QUEUE.size(); + for (int i = 0; i < size; i++) { + String sql = SQL_QUEUE.poll(); + System.out.println("[sql]----> " + sql); + + this.execute(sql); + } + } + + /** + * 数据处理 + * + * @param entrys + */ + private void dataHandle(List entrys) throws InvalidProtocolBufferException { + for (Entry entry : entrys) { + if(entry.getHeader().getSchemaName().equals("hc")){ + return; + } + if (EntryType.ROWDATA == entry.getEntryType()) { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + EventType eventType = rowChange.getEventType(); + if (eventType == EventType.DELETE) { + saveDeleteSql(entry); + } else if (eventType == EventType.UPDATE) { + saveUpdateSql(entry); + } else if (eventType == EventType.INSERT) { + saveInsertSql(entry); + } + } + } + } + + /** + * 保存更新语句 + * + * @param entry + */ + private void saveUpdateSql(Entry entry) { + try { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + List rowDatasList = rowChange.getRowDatasList(); + for (RowData rowData : rowDatasList) { + List newColumnList = rowData.getAfterColumnsList(); + StringBuffer sql = new StringBuffer("update " + entry.getHeader().getTableName() + " set "); + for (int i = 0; i < newColumnList.size(); i++) { + sql.append(" " + newColumnList.get(i).getName() + + " = '" + newColumnList.get(i).getValue() + "'"); + if (i != newColumnList.size() - 1) { + sql.append(","); + } + } + sql.append(" where "); + List oldColumnList = rowData.getBeforeColumnsList(); + for (Column column : oldColumnList) { + if (column.getIsKey()) { + //暂时只支持单一主键 + sql.append(column.getName() + "=" + column.getValue()); + break; + } + } + SQL_QUEUE.add(sql.toString()); + } + } catch (InvalidProtocolBufferException e) { + e.printStackTrace(); + } + } + + /** + * 保存删除语句 + * + * @param entry + */ + private void saveDeleteSql(Entry entry) { + try { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + List rowDatasList = rowChange.getRowDatasList(); + for (RowData rowData : rowDatasList) { + List columnList = rowData.getBeforeColumnsList(); + StringBuffer sql = new StringBuffer("delete from " + entry.getHeader().getTableName() + " where "); + for (Column column : columnList) { + if (column.getIsKey()) { + //暂时只支持单一主键 + sql.append(column.getName() + "=" + column.getValue()); + break; + } + } + SQL_QUEUE.add(sql.toString()); + } + } catch (InvalidProtocolBufferException e) { + e.printStackTrace(); + } + } + + /** + * 保存插入语句 + * + * @param entry + */ + private void saveInsertSql(Entry entry) { + try { + RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); + List rowDatasList = rowChange.getRowDatasList(); + for (RowData rowData : rowDatasList) { + List columnList = rowData.getAfterColumnsList(); + StringBuffer sql = new StringBuffer("insert into " + entry.getHeader().getTableName() + " ("); + for (int i = 0; i < columnList.size(); i++) { + sql.append(columnList.get(i).getName()); + if (i != columnList.size() - 1) { + sql.append(","); + } + } + sql.append(") VALUES ("); + for (int i = 0; i < columnList.size(); i++) { + sql.append("'" + columnList.get(i).getValue() + "'"); + if (i != columnList.size() - 1) { + sql.append(","); + } + } + sql.append(")"); + SQL_QUEUE.add(sql.toString()); + } + } catch (InvalidProtocolBufferException e) { + e.printStackTrace(); + } + } + + /** + * 入库 + * @param sql + */ + public void execute(String sql) { + System.out.println("sql======="+sql); + } +} diff --git a/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml b/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml index a26f4bb..15b2156 100644 --- a/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml +++ b/tashow-module/tashow-module-infra/src/main/resources/application-local.yaml @@ -7,10 +7,11 @@ spring: username: nacos # Nacos 账号 password: nacos # Nacos 密码 discovery: # 【配置中心】配置项 - namespace: liwq # 命名空间。这里使用 dev 开发环境 + namespace: 76667956-2ac2-4e05-906b-4bca4ebcc5f0 # 命名空间。这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP metadata: version: 1.0.0 # 服务实例的版本号,可用于灰度发布 config: # 【注册中心】配置项 - namespace: liwq # 命名空间。这里使用 dev 开发环境 + namespace: 76667956-2ac2-4e05-906b-4bca4ebcc5f0 # 命名空间。这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP + From 5e5c13329f09b259fb76d5117a9ed8e95da6347e Mon Sep 17 00:00:00 2001 From: xuelijun <977662702@qq.com> Date: Thu, 24 Jul 2025 09:43:39 +0800 Subject: [PATCH 2/2] =?UTF-8?q?cannal=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logs/infra-server.log.2025-05-22.0.gz | Bin 12572 -> 0 bytes logs/infra-server.log.2025-05-23.0.gz | Bin 21675 -> 0 bytes logs/infra-server.log.2025-06-12.0.gz | Bin 3259 -> 0 bytes logs/infra-server.log.2025-06-13.0.gz | Bin 6993 -> 0 bytes tashow-module/tashow-module-infra/pom.xml | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 logs/infra-server.log.2025-05-22.0.gz delete mode 100644 logs/infra-server.log.2025-05-23.0.gz delete mode 100644 logs/infra-server.log.2025-06-12.0.gz delete mode 100644 logs/infra-server.log.2025-06-13.0.gz diff --git a/logs/infra-server.log.2025-05-22.0.gz b/logs/infra-server.log.2025-05-22.0.gz deleted file mode 100644 index 67228b414dcfa149b8d226b4d11208988462085a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12572 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 diff --git a/logs/infra-server.log.2025-05-23.0.gz b/logs/infra-server.log.2025-05-23.0.gz deleted file mode 100644 index 0064c6caae8ecff399a29fb4733c69f3f8a6f444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21675 zcmeF(Q2mx*YB-Xgh)xAi`*&ZX_7Jo5VYGvwVV`5_?-8L%D=wy3+HnD@Y#f#O-{GG`%3>?fLl}m)H9>9QX5h zvD@>JhL?}_(V3FTbg9x@pukkcBv#p9M(K*ZS)S?IyW&)Ly#H}}CFgg0UHjdBe-?RS z&eK&?>#VA}qAE)3I%Z~NoO!vqzYJgNeAJ9$!_FL&dyLWYB#qVAi1IS=bej*ELR$w! z$Mt%M;M!fb#?>m}WE|2fWlyZfb)>f173n&)k}V3ybK$7>*DE`KTf zBhh8v9Y+HvnYWRLURu6<9vDt37Fx2IM(gPsPOJcrhwnZokC)E|^TewecHJk|_Q5k) zxtvm(&n*APOAa>gx`trUJ!al$%gbh04C^G8r;kO#0-W$I47Q1Bn&FiS0H>E=5Gu#h zJYF^>)3R|pUaMhEd0Cv|#&Pou>Uxf$iZ}WaKyPElY9G-pBo`+7egw(=1tQbSiX#QT#Gigi2f!$Ll|GX$bO1zfyl1$<;X5inUmp(2W3KMXh>cRsE+D{5rAR33@K0M|%C4HQrSn+hlf+QRey?cAs@5xJoWtO~4* z8s0%I7nE<6y8?1X<8O|pEr;fPgd@ZhBR3}WV`Nel4)d{u8`bX~%wjcLAGUT^6AKQ3 z0Df`Z5+Ku^s2CP#N!hq4v;nE$TipK%wWnZiOHu*}w2Ev-O4EFZ2x9%JWw~y*I%k*l zDvgz)y9Vt%7g8WJJ_#@HO2Qg9wEj-l*$!|dmdTL`sg_}2%X8B+z!Mkqex4gNOMmK> z&=Z~dkXzMS3c0j&oN;P^T+B?xT0DLMF#k3#3DQCD69u4o(;?jb%xmm#(qPLAGOc@Y z7?V#LB8B23#YEMvYd~1RVsa*}f7B{HTs}WJQj%CkdV#_*dVbZgtb(rn7!0Vg0zBPd z9cN4Ot11y7T@x%@$W`!rz~0#XWIWQA#11L@<2Iq2i!2?(;k(j&``pU@eNIkm5 zv182x8HR1+LYU?q4%BE`=s+r97VZ7HmORT9 z6mb)I^{w(!ghE+o7BBtNXK{4x`Qy+!KqIY8Kxk%#Pks|`Nj_6__5sMG7z|og0VogK zeQBc5g-qk2^ptbh4NoTEaC|~*D55abB1mccfu)y-t<%I&;{<=sZ7O7a_4eM-4kEam zbt0)7e2!B8={Y08HN(O*@cM%MvcO6x7R$$^at$Baa*&k}>&OQ)VHkL z5WEl-O|4YS1O#`3?v_g_D4aE-_+pRwYzt|Va_mJdrqbNw+|4w>*(R}$ILli$AM4&c z&bHkX^oc)vJ2U+zn824oGJP9gYsl%e1lS9F^%fte=iwI6De44SJ=2c+Yq<+SFn^^w=;R5 zr2#LV<8f%~LV25DtiXQ;zu|S)&FaS1rRC#fjy%0M!*8>8V|S;m{bXMjAnH;eRMxGn zvxB&iG1}!XEgjCs#Omn!hE&(Tz_hLtq71biUFi|#L7 zFcUkZoseKSS+UOCGd=KKf^GP>PzP7v^WRi!?otmqyIVgMS;%ep7+sNU73gB zW^JQH1BlvbU|UFaG><=8$mr092P@;(D#8cEen5T*jcJ^{XWps^Z7p>^(KLPq*KY{e zh2NkdZFgHF8zONM7TK~D#H$bS6ZF;Z{87Z$4vB>p=v31ru(EMAfvDEz@1XS1Q`U@| zZ?KMee9`;85tUVpuBYVe&j9mjzvXCdNiQ8i1jg`7U8Eu$$kClm)r~dgnC8-kwMPw{ zigr<)Ut2v)EP#qy?c%`m>@0IftU=AA)0|ZsC2g(Ss$!*9BXK(o!h)v~;!CvEnomfE zalz}d&MkFh=5i7WpoHM72T0%0Nyvj=%5k}CBJ)Hb+7Le9 zne{0>h~NrPt-WG(lsfy$#&8stovyB95|XW=Q`>8h1Nmmu5!0gI8`iD(>0D$^YA^5| z2^>l@Nb$=2Q?FIdCD)NN9UUDk#uK?kXZV>&sZX7q#INd{iO4SFcdbpL9{G{2DsqxM z;uTzk$;QJrLP7x~9NB3Lqz1XfytuNUMU>aivmaq@N`kicA(%kb!b*<=BAIS`;jDd( z4_;d-hY@l)d@gey$1>Pl*Ae@ysY)H*7=AgDHTnIhx*QYKJ!IHqK9ig=L%`sCOwlti zYS&!2z&rV?ONez={}#!gehkM|!e_ORF~x+h^oSJak-r#AGa8uU zdKcON+;S_Hq=2t!3TOw#tl`1r-P+pF^{e-Ky}$c@K=bPF>NaA&FN&a|J7XI-`<8saev(=ld5Xk=etP;khof%+hOzYIz@ zN~(*A=^18C1{2z1nqfb~qc1NZ*v8*S&SziH1bf!US2)eRO4o}nsdj@$k%C){K9*)) z6SB@hNY9AJ!*2y^#^vS5?45kSm1ffU1jyJRQ{(dQ7c$fiHC#K@!-Vyx_q45cVrcPz_bJZ^UJD%DuxR-0*XOx+IAmC7@TA#@f^*X`H?=P|%r1Tgcb zZj6gv6X1BsA2Dc@GoZv2LLze23=SVhsaJwb^Kh;qI7bqO48ScqNq`u{IssMN;q;(; ziVl-k^M}sJ=@4tVLVztKm@_24Hrloql7!Aj<#(E-Cn0{aZ=zwo08#HWD>KgWVjl_* zhYsFcq>e%cP*)KEQsdt=evD5ieu7ju@!B)FES)Eh3S>T}V<;OkW7>gpmNskdD;WlS zLri;}FX@}ZYr&FKx-x98SoQK$Ib-cuR+So9u5m9l@9qF*5*_dBr6JksIPTkxf*YoU zS+nfagPSLZWl5sfQJ$VBNu!*Q=#EjX(6z*~;86%J?hYJ+u>+;6G}}3 z6TWRDex78 z?2YqkDO!w@SVT9SKUP)CP+xcN>U=PFQR#9G-Ec5)1|(fR_hwILcg_^n?Ji_PvV7!^ z3-MgKzso~=4a2p(zM#2Q;#9qR+$G>tU!no(7%#Y!F2Cm3AwOhqIS5b%^gapA1fwQq zk?ExuCj-zhLuhcuYLw+!rKRtc2V`8Y1pR71mV+3WRBqky>*;(#6u$j_@8AE9iWx-v z(88duro5l7cW!AJ)i%_bi5&p_;M9ReT{0XWbBj;NYE4Wy;{_?MDs^K~YV^c6ikR&u z`X286nsAm`g@ffKi$ephGXCKj`@YID@?#n>vNpPQRCP+~a;^66>gcG1>F8+Lu&iXc ziy8CPEClW@$!(To?e(&*VYQ8&c9~g>gXSacY@FdVz=bhpYHUuVyTR34Ny$2t>WM+Z z?og?m>1rezH_ksnUB|vBm7MAJ%HI6FTYRwB2=5y1#;LKLw}D#ECc7t!OF4{x$MtDc za2YC@+vUW)Ze7V{WfmoJ`sNP2aD(KxURo|%im_tq`}3S>_~5uLqiISaV2SLy=1s9D zfOf&T@+H+1_Be}heNR=J@IloSjC)j%t<7oVf_Mxze~bKEu*RiqyMsWz71H7LfPokg zsjq)QeXG)(Q;f)$fwpa6h=ig^=1iQ+u#1$swW`O!AUTpmZYPModQo8XqKRbZjYR^P zSU`a(KJ8*Wo$!Hx?s0E7bnhkE9(%|nWVU(nh$aaqkBAT~oL7rruXxPoH;n64v+yI` zctU2LHKqQc1M+~W#9o0jGZ#T)qsn0KOidDzut)+4vv?;GP}5RLVJz5U4q(gR;LEAJ zbr5nChqpIBVVgVzhjA#74!;_%ooE6Ql=Pg5%b?595XvB?X{t0;!p{v@LJKf zZNwL6Vrvd()hBm(W1f>%L?ZGe0@9<^B*%!|yhjxvone&~%oN}8I0q2#t-}YhkXZd< zX<+z}0pjFUrz6OE4U_UH0*V`fl80+chP#|FCF`<8RkTf-?cPNr;6ckR{1e8__6wMT zmEp}tta2HpbLOZmPYb}(Ov$zyoH5cJR_e9eK9?KEAia|~tesD$V+RTTBM}}xhS_!c zWL~l20BX#{dAz>`&|<^~9^n>l?fO^h0b)wYvU9)`7SrGK_Ienk?MMT(jb7ExX5Den zybd+lDz#6&3u}ivcufzDfK8ku}bQrYi{=8+%`QaZq#I`L~(se4DsA~PD0fylhxGjNp2dEGnT*Rs zzj%z6Bv7wg(Yl@sx zF@q}poC2khrv+P5p8jD;qn7S52f)2bffmfq5c0P%`21a5oA_YiN z7D(8vlOB{_)=}PX@i>Z3C*qk$De0I)-7FW?%dZNbeB7_g;aKB=+v-GI8(rYOB+5LXS zyY{)**84u(%=;ef%=;Pc?EMLYeMi+W+?K5#84lQPbUB#QpP$?A*sd(_+Rem^GM=S0 z6tjS|A2aGcP99PG)kTjV5q7BRDgUL;CbV97=x0)si+~wmHixpeE-0#54@2 zMs~&2gtiHk>U1#5C9mhp@NRwoEPm@cvQJ@g|H}9G!AP6-|Lz;G#pqa(s=s)PWQ{MAD&HuGeS7&7x8`6BO-$) z1o(V39ZqU^_|X^VYvXnh)#T#NoEjm_8%L>U3kRn9DNxIIFY_Z@`0eW+Vliw4mQ?14 zKOl)N9rnwq;Z-4{7ib0g35iOOq547k^)%=nXOScvj9DX`3;y6Pnr4BUAlUN_? z%OXHR7uPX}Xcv~niW0mBY*Rv&?aObq$XME034Hn07ymmwhjpkqG92f+=FVn^aA=Npvq2)P z6k|eee|-xasjQG(b0>{8DH|5H=LcfwqwyVePlPTTE@CWIl4?jfeN>^aCS8(hAW@fs zX@)?#5QF3x$;NhTX?5ID9;BA;MiYms$<;v3SnfEce1?RVtgFwiUVTnANCWD;O5%Cm zKmGky1WgA{ex>nF-5C5*I}jdW80Lc^kbxg-NG8&3$Nj}U=S^3=RXm|z$V$)eddRA`#> z9X3z1MA6t&=!mBfVs(p#Ji97iPb4p4Xn~GQX`N9KJI2*1G6Y|_d=SsVwMSoVJL;zS zgQ6>qvPi3PmVlE&XGPV?ZZP3JLR?jgbZ7zpAjUT}Ey2~I!Xg;&P+NBEUj69PZ|aI1ehteX)= z`A1b@xZTT?^FYwRfb(@)h9+F>WD&6!4sKJuA?A_97m@(UvW`SRMl6dz1Mp6ZMZ+$y zhc&BEIeSOdQoL15i16gu+wdb2F$-KL3D51_Rb|^$wL(&q1F7_hJWcSBNjmfMH@#!4 zjaeRvNN#xI5-OVD_>1M=XwLhQP%y!ZU0T?AJI+PvZ&H1zp}4C|3V^ zxHQZn{N2tLtMtL0a}9=S-L>7ur3Fb5uAVpf_+^D~if)cRCI{Ree?3GH$5c>UE)<-K zHUOOOB9Q1*vsbOhP0$dhBSt=a*dBxty9KoQoM-?K{bqQb(0L~(p~d1|w9A`QW!Oty zEfR?sX>+m__8UsEqxwBu6kR9wRM+odpYQz;BU=rgEa5WASVdP9(k;`4#)*E+Q6p~Q zklxi>HE72qn57wpaa6APPkn?z6?mfMN zA0#0}^G^+wc1f~QEz(p{8LSd!ogG54t{Dki)G7UHUt{(iaV8}OsU?^ecBd?$Un|7m zBK(X@IpYJgWa~~U<A5Gev8}=#{(iUl0HJMjdq-NU$8eR?I6XZEz%pxeYX-(vb$~6W)DpO%rQa#5C z>C8Y*2Grx_qmoehRrOdy0X#gu--*e8EJAu%_A);ltF-a4>7~pjR;Mc{*k@Tk9WV6{ zZSAWRnJ2Q1M!Wtfak>cN@a8Da0@^`2vd!lHNq!fVrbydPhku=ha1EB#?o86jR0%j# zdBl{5)@4w#MadFws&2@;a&+&5ff_L8=sSJ0^ik%w_Rlnw zAOzW!9tw)93lG0Y%M4`y(sI6yFhy%Cz%uvZ_)Exnd(b7MnBa`G%KwasO z>9mXEPV|BPCiY@^W+vGioIYHnMN46rMnrlXQx@bp)X>8?ecS zU`U>=7cJ!BE%1xoV{i?eF^1cAK^(14R1Eqk)+G{+7|#q*Y6NIB#feT zt(h<>jJ&tnmjxUyTqTb&{nOO3V)18lnmI8&xy^e4y5uvHMkC~XM%Za+i49#3js9w4 zxguM&)mQV)Y$GdFs)j{z)#YF?m&J$ioPlq^abfFSqOtA7MAlAJq{m}&zUm&ICAXhV z3RhU4A?$;xgSQ-^^f{(EpFq*JQwjn z5Z6$5_##6TmW&)E$AYBEfR;A!pPpXNO)hGjI12u(^Mj~i_aT&;deMPu|DCtTLbP@H z5R*!Xp#^u}fs1e8DeyZcBj!|bu}}g!bi{e^qAqGoG$PFi8bAgb&+9wsF!;wQVBn*p z>c@LgIfvHnG4T2itu0P_=BwOQb)FHDKQy(SLr6-Y!!N1^LOH{5<;{xPPDo_V-2f5> z6t8-{u<56d9cvO!-Pgv!{6_=IG&+t?#b9Nm z9}`SPjuj=_LT)|o2vH@-Bn77gO`E+gPo@?g$ z;0)VU86%0@HXwm+)_FFyxAlSafyeC^FLC8zup>jin?RdFWF%X;h8sIJJtQkcP3fgNinp8TD0xAHb^$~6`LnY*S zZ<_FHNd{*hP=ypV4rxeGyK+qdR}@|; zU!F38$c}|z;>KxELA@>1r9*3)OmP$3#pQmo@s$NFd_xQnx1{iLjAeS98=Z0DEPkND&Ox<<|{yW_nMdza`d`Io4ZoGF)( z4hQ&TgT(oG34dZT&W%x;{L+~U5-|=Tck0>-#HMqIMb9K!iw5_)gtH6rGpZu}gLwp@ z;ce1B({AB;@Br;GE-jf39<}XK#L#9prN|R$x)L3BadQebn!^{x9$tKB!^Y}d53BzzA z)P=8C89pAMT3dLC$;^jLWR$^a7hy8M=J;s|kDYBwIBO@4z<;y9tsghS6?GbjLvu7J zpCO};3aDYVL+;Q%H*u2#y}LUwlM!UE2t$_#`0`@$PEHhe>guV@89D;tvs2VBt8&cs zmji|ofRCqUjcCGLLoE!`p$%-_eyIEYdmXtRFVwD$e5$CzuisV>UW=h zgq@pdygCuL98diG_g#nZh&D?MR~4HGns!O%#EQUJI5$?VQw^K1CBFdGG%%iiB+r48 z{C+zjbv#UKde68L?)HAwU)}_^=kUn1+VAFB3{==rC*JAhoJP5yO`ctRaI4WwDx8EEaHc|JIfFi zj)#p1RNP%IU>Lv2hU;?4HODPsFZU!nZX})^PN}x`Qx_~-ivPA77MhsMEO|VN&**FkcY(sy5 zaQX>?GpbI^&N8M~|HYGNw4bwsJ1jty_Ib=QJoHzCPjuxIfD22GGw?Z+snBQ{@KHqCJ_F-n6A~d( zaiUX00)`VGAL4h$QHyD&PP#S*4cG}%N;aK+?U^ZdO0et0<2k|`CxZUJ+%1Dl7g+@2 zCVXdiv1NW~r7M<*j%78$Bw|`B8_8XUm#o+@Wf&xe zP*rSU_SgjduB)N6Q27N`_-o$;$dVN;Xt1I3CL_}z1Y&zUpsF@MPUV>`(Gk%9A8K}L zP-@Hx%NfzJ;IMo1qv!!@Nrsmq5<2~uZz+lkN}7WoPtJiWO0e@zmz>DM!Pt50Sj0;} z0&YdD>;qM!C`?j&^L1~zvtjN5J(Nl9S9Vb>RNX4)LpZAi~RBJCRdEw6-; z4{#wMFfH4Pbp)cEKCFKbJ#I#o-d1e&Os_qEwGTB*ud_23)?%PwmWM`r_n}`G?k6B0 zS8ek2>?wZNSZdvJ3Q@RX|#n&7J<{gouC<57#VG9;UBy5l4mkE zwKZQ6BVlYANJ5Wgp01Y5LCiCdIXr+gGA3PV9|_AnedlkbKWn^rHhWcJa79RNAyXiH zv0ft=W8yWko^l)gz20ZMB=6lzpl!;$IvCoYG>AD;%$KQh`TDfL2P{qyvz+ptK= zgWo9exND>EMIqV~y*?Do`Lu@o7kQ0HtSvHHU823Ea1>L1(w;1=cd!~2pI{QbuO7uS zqmGag^;y4UnbWTDmD#VgBKY_AYFMJo)v!?B3f!I(KjYX)(=sxKVLlQJl4A=?lsblU zpH*$0fE#Wo)9l0u$5;`2O8gd&j$2I1qm(vRvY%7bog))USYhoV`yTqT(0_d!tif7w zL=LQ+9q{9$e?f#a+N(kldpmVzbQ3HVrY{B19TzNpcyH7IlQ;MMRW)P1D{O{XIq~oK zH5y$7I_<&}r^#@GXIfiAsFP-FS`@*YiKlQB8Qheg@V^4=kTvaSaE9Asn8IozWeI=V z0_ZWOdE2x3tG$zz*Vpj%{^aP#tllNa!*lHX*ddPZ)oCO<R3jFZy_L=ULZJbgep$)A<#y@W_%d3sDDB%u9ln z8Sp9TF}V26AWb+t{206~KJG=)f6G2axJ=>-@=ZXfVXV{-_3Ec2O^-CK+oXz<>}8ImvQPhWQKZ{|m^gIS5P zU^t!cWGwqckg_VhN!_gK)rB$*rPO~_*i@eBWXH@DXr+HFHf6CY+tjUem9aEKv2Ua? z+f+~Nuf%FNELJUB?rd0~vdpG5R%M&G6|63pYUr3VL(y*yJ}!WWok9@z6iXSZjV6)5 zy+se0<_#z_hmwk3Hi07~Q5lvY(@r%el+^wQi508AlsoFaW5N~HsRW2|cRj~lZxLe; z2c?fnXp3_hgrQ*Y*94fR8BB&J$VqI`^cQe`Xd&uKUc+qx=9ITGd-Y-#-hlJm$tcU5j& zAj`xHJWDiBTd7FOc=yHJ6uhxW#F3FpG$M-f2;@_gh*l=&t~4CIdLfE%ZqFwm_eJ5x zVv?!0ZM2bhhnBOntrm>pFc2}aKGvWfA9ro1-6-zeIHJY6Qc^Ie-*KRX22&m|lE26O zCz zr4o!Wl^uusK<~3NPkP-Ma1KNx@A&90&_CtU4{W{H#p%*c)IIuYN@vE>HgUBkB~DGv zP2>JVRjWF}PWX8dkwnGv@lkdB*e!0_N9;CB--)kdn`rRB03h3C1>(URKP#g;#oOcM zRZ-P0mhO#J*8Wtrn)6}CHXH}e(>7t6z^?FUt8=tn@_`fuEH9)^Xlrr&{5!csF1s&= zTN@mr5GNbTgiZPWDCcl|MMiS59-jp-j{n`~fNt~RI%PS_R6XnMYtt%ndeVi>BEtp( zri5N@Pbz>Eexd$)_nxQNFV;S7*CR$-zkuYCcy>{)fLQ~IylcGt`<(}qJQ;UnOAGb-S0IkvqSW_}%*A~mymvtA%(6yQUSGJPb}j+(BKn1k@)16{E6E#jVPZB=44Z@n7UB>sP^P+hJj+&gyjC*M)QTt z;a8vSV~RyoOhp5?92USuq7kdnXh6I!tF~AWZ+ovAZFYOR{EniBQn3}8z)c)WBi-)azpR;y; zcYmL69FiXU+i-r*&tiUAEr!2#6dAKuSMAJ=n}4%Y50ugdy1X=j34XYNJDDT)Y4a)7DBd-J9 zjU`;0Y6VD4`^;b~#@QsOE%jDqO}c8O@cii!o}2r*apqE?AU2q+ka;A5?k{Q!)U}b3 zS(@<6Vcr#rNc@xKi(!pi`LgxledvPPJP9iAwfA%M15KBJ^&OSWna}?Nz>@t1Sdrr`q^BPH&%q#Q0TzngO5Zq9A>H4Ea-_ugiBjAlSW{Z z34D3lp}hv`Uu7c3l4KRzQzkoP$CVYtD&5$C9_xlXCXy>eFsv%`8clqJaD~7-l`~&X zH(EdMFF$`Od*7Bf^S<7%;(W(bzx_TA{n}ot-TdC-?EK#0ZhXJdZoa?qI8U{VBV4$e zG10(WXICPGf<%nmE?jFvuYIh1sTDn2Xd$n>74jE;Wy+oI7{U^V=eJ?@taU7(rf_tbpZEW>Dhe_tqS5sL|woaxA!+y8fC) z%O9&w4hH1+=oX6QENQ1mv$Ne}QcCUlIJj9`GmGCeZ}R@H*lJ@Ne;nv#M9P}I^}(cZ zkzAaf!%=_e^-;)edkHhJ}QSYIzCD8q%frlFgmLDp1jBAl@3Add5g7N-kit$t;?yY{xyF1Xct}Vu_+NQ=(f{^@>mZ;0T`Ej zmC^(<;x zMi+mv4FU=h@xOUMbbC-klub#!p&m93o{JFiD0zPJM>8^Y)ucJ4U+5 zZ3b~VjQiX9W-yuqfi8Tl!q90S#ro_`R7M^|BBL~Rt1yE;Hrr22c+_lT>`^;WINqE6 zb?t}&u83oQ6so;W`2;C-m|rc64N`~psiBiB=+*tMk(2;?SqPfk|GOKLS5l&wLw9#o z*6=ENtHvck1Q}0A6y(YOIQ=e8ft!!7Oj8d+C$y%X2rwA~CM>s77q{ojV|$6~GD z$F-iXzwYIYswHzHiNup~kp!I;=Wl0~RQZt3x>f0P)tC7^-k*bQwBB;&BT~$^7r8|W zJC^eY#TsNu4(r|Z8ff$H!;^pRjpWlab!Y|Y#q9$_Eh;QmzA@`P*F~*-U;UlE?HL39G72x9B$*_Tb8;HflQOxj=OHla0}b1+RB2 z2Ct7HMgv7%LI^#rWq@2Ax94SKRL*||@67vsePdj5b!Ge{=`ZiidRK+X%l+%fGMtw> zxsRovVS1@*B@|%=Hb$zgUdQP=L7)T5zl|&(*(Yaf9uRGP&9XE|*EHn%S#~QB zrh=Y|)ztm-Nm00cmk7NeMT(`%xbFX-TBYKBNaLd}9EX-X{5mpZI05g`>vMM$fF1`X z?$J~1SHWYz@(ZlA0-f0l)d(*Zni6hxh6(&%H`b)eQvQ9PuxxPK{E& zVv4l^_AKNzud*+ftWONe9Mm*tw7&HsZ~SRUh8D))-+h~|P7n8pnS~imP6o}7u<%L~ z@6E(Q-FmJc#g2gctA{A-`c)!Nk5qc_a&5e^Vru(e7g82p+7KRV;+3&r)e*L*p6k=7 zO^<^iZs;kOltIb+JmuvZ7q37)08vaC(%Fsf*C9!1&;Aa1syTbT4lqflu{{>ps4uOb zgh+kzqEjE}!7mwEX>{}82)|C-jouuGOE3erFcwhiRh6Dnwd0Guz5h) zKV>zH=)8~5SkbmThU3KM{er*9Vqu(~Lq+q2nsNXljahp^nS9nCu7MT1ev_0RvEyVq z#JEs44Cd4T{3B-Fnp{fRDy*Q*rD1?HNM}7EQ%(|9%}RB&7>2p|`|H}6#65&37n=g-0tV@Z*zUMfxNlGu#r;owDRW# zPVZ~qZufgwZs%)MuR*g(1rGdg1q+?0Ddz^d_XEdhPON6p%iYnjK@hY}snUbkb9Y&M z)w;h<0+~VVRHNCpaaG0B%(Ao66{UUWJeLKfzBml2S;kO56PKy8q@v=yAo* zN=m<1O;+R<0C1{r_^2B4pkMP8#kKPo9K1^>;{O(vNxP9R$nw`~0XBxu7#6?X9wR;R zh%?-DDJq2iW@CEa`)q&zn&9X8A@?)6`SUnwvF*5c$uycwksI*|L1v0QE|e#MSXJf3 zMbu~bd1_Kyub%GTl^HrcOD}VR1@h$6_@B9WMz^1 zFfQyNajJ5`tFoYP<@fXE+mEa_aO1RJZ{fzmRHts=`x88N6q;*Xt#m-c{DATGH@50C z9r4!<8m5Ms1NPErcvrT<_?ud-O`w-bVN82jgf?7~!>+oJ;)QzP!<&IKIdq>qwa<6; zG=6HwMosda&qj@W<^nvt1|2_vjYWO2v_lc+td{S3zT?D_a3ND;B#CIl)&MnQhpqf= zo&VIk{tc*(yW%k+tK7vxksWJRa|(`fuOp^nW+Z zN0<~HG!G=o^|7Q{5_*Q@2#f_`T8N8}r?NOMmZ~$WTIKYzWE3c6?WkCaH>(K})K~wl zU5@k-@uOaE%S5F@Qj`s`=$R~K2G^Mbha!62awWEt8;%(F({7JA+%GaKMn{MYr+y|Z zyh>v$S|wdGZIclZ?bK+dlpW1*!-VURXtW20XAD02ziK(}e>N0;k5>?n*%nnJHdW%( zK|-k&tFdcq(T5<2oho9NS~VNHc6&lmd#l)c6Ka>(MN8~sUiaSDc|EW5yk7UW`}`T- z_xJt&j23D8zsXvwW|xkX9B@q^q?00BFp-e*=iNM`LRSn&ub8EqMG(J<($wg5aH3xB zf}Uht`~4i&aCQxiBzAcBqbtuF5ZJ> zsW$CN#1{Bx&AQKvwE4+{aEM&pq7?+&kGg7t8&vR>mx37vV%<=8^uRz%bBAF1OG|T|%8eoew&H$gK}}B%b~6PwP02YYYE7F$N#R}{I!j%UnCVOhyu_Hr z#&4%VZvgj+-W1oLeqpSPauF6{d)}TTop^cUnsb8x@Ks9DHkbGr^Dv(6nB1Q~5XW#F+YoW=H%9}Vf}L;%0M?Mtj3k_YmQ%U8W)7cv-^Eu+#{}&98+nvW!zGrZis?V-El!- zZC|bw@$95^7UCL>!SLI;$4rQaIX8y`AW-=l)Mm3ok=4i5xGjJ+7sLTiH1O&%jEPX% z0wfu71bv)Rb@FZGWuQ59!6JD;_1@Z4dlulGTA4okP09VbgwS7?;dt}k4XgZ_io?OkYYJ_to_~)mg=tAAQ7Vth?!h^G^Tdj`@sV?R`^fAMF4`OQ0;P3(2niANosg&;S8b5K$8sOmuv_;1m_e(@hGsOs@f0D> z{p1L|6!MZ}WHJ~qzG=*G-bGA8dFP6yjsc|ebpvV=@1cPi*nULnOtL27ji;a4 zlT=V8%v0^=0riIHp27JFmnY=ey~5GZ?&6pnl~iZa5hA)FLTxaJ(SkuM?ugU;K5@C( z&QjZK+y3KjW1g%=W-|JrsH^RlJ(av5`!g=dQK8!=yYY zG%@DeC+}TP9?6`7x?Wfbc9cqe6|36Qp{wqbIhqRo#AgmenvH02HN2ABukj>-*{p$b zH)_^6^r<4+0r4>&a?q|vG}8EOMSe^aMDFSf@8U6G@%U`c{3cRJN;GSG%uPVt1QO`e z6r5FBo7C<{jQW}H4Kr&MQsr&CBLviApji@bu>Pbqy-)0DGh2=%KJ9x-2L)? zbl*BBp+jrEW3MoG25PYSpay~otIx=;l6wM!Icygd{!lv^?`c-x5H ziXz%)>UZsseM|u*<~O#$>^fF#Kf9Z7#nKUkwmh!Uv}@z_aa|(Buxiw=3;P4nA|nky z1(y?c9K7avzLt%ER@vZHY1ib>8JmBJ~HAeHpye10&Im#x`SxTEc z9S~ zpu$r;dcDiw0f~+LA5kNc)5(}P;4Ieln$1OwRG(G|n;_(BygRA2xeX8GmjEQ2i8DoN zesWI`wyK{nzeVRUOWv%dq^Yp>PQA1tD_w=Xg^WH{Hb4^i>QZjJ^@XdiNpTE~_IPJn zLVgkhkL_x5cIf2x&#vc|{asr)?Iv;waY3+!1g(Vv5suVY+#7ysNkrMQ<6osXD6EnS z{J4>WQ9iIvlY1GoWmZ}v(x?y-ct7OzD$CGYkJXDgK3N5Vdj1AhAY`?pt>-~JhINQq z@nvrqPBy1p6xcZ1q`!$SOkI#?>+Ffnfl?Dcb0L(-4tFQ_^fmd0NN3GnjEVOznl#>I zRrX^53U?tCFr~_AfpL_Tc_f!t!#}=xjdYy(oqYc)6phA_{FO&q20jKD#gpQy4|Zas?Dw|SDd<`Io3iC`r)WDKUCM$j?K9Kw%^cO%xmt; zzjk~?^4|DeL!$TB=acShKK>tC1pkW`_1(}S-v0lJ^2=mSF_cFt_2- zgKm+SwSiUYB^fvMvDW%zfadK|$BmDg_mRM@jtlqQf>1uEQ0i#Nl+dPVI~TqXdKI#; z9Sfq`-rNTP*&C+$i+S14#2T)^qtgE>km;X4YYtbBqi(UN+{c!wSgEkGK18C|arUDx zROBy|wVZo`Xt+Ji!mJx$|J@+-&2ozM@!)MMiGqpro11;#u1ubt@G_2_Rp~ItP{_Ua zw@8&N{YE}9={bJ)^GF&!XAWb6(97_i-WY;zq;`VlaGyGI@bUtFYLA`!;OJ$IwyOqZ z>KUP%Tk-iB9!89_Lxkd|tJ|ukDGGU!bNQfG5Nc;@&1807w{a;r>a%{V ze8v3_^pg%M&m%Qlpw3W&tP1D79a^l9WlytRxCTqu6Z&T?% z&sfkg43sw8qr&e!@D!q|Yz|Q{nOTJQQ{Ku3;wFdtbcejSyx6^QYfWp{xKoB{17*=z zy1d<|b8!j`y2>g7hF%IW>dho;5#b=On?1R0-5^!nJM)@f02~&$NZprf=fs)ry0KIC z7%@xXfOrnrE{#SFG5FrtkTbVm9|EbHw#V>ES;sCI@P&#J`eea1;r=sgme4542RS8H z%h=MH4tKS>2r;=1PmBupY`9uhz{~p1-Ox6^D@vGrZOY^v0rqzB!t25{E=`rm3d~fr z--UYDjHN|;UYEPgaZR3Px5FI*nhl>@5Tkc(F7gK!)EnmND;B!@?bA~Vk1wPewx#;k zD)c;@GWiP3R<=0RwjwJ>QMLa4f93Xtzo<9bBT8L3iH{DDs|La6DyoIZJR=4YN6YXJ zap`T-;o(E|I^iheh8e>m->R8Xl)Ze-tgCko6900Fz0!x9e%h&%=V`1fSe9$r_^Nsf zp+)5}VKbGQt`_5iHRMkNDhh#}_BsP$KfU*i&gjf21CFGx4{k)8MYrn}v6hR4-Ig=O Tz}pL_i)4r9)Rz}qfLs3sAw8Xq diff --git a/logs/infra-server.log.2025-06-12.0.gz b/logs/infra-server.log.2025-06-12.0.gz deleted file mode 100644 index 8d54b58c9f1ee704489cbc33bf7f630043d31d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3259 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 diff --git a/logs/infra-server.log.2025-06-13.0.gz b/logs/infra-server.log.2025-06-13.0.gz deleted file mode 100644 index 605b537d38c07c320ffe78d6fff5479bb3f83306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6993 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 E00Y;OP5=M^ diff --git a/tashow-module/tashow-module-infra/pom.xml b/tashow-module/tashow-module-infra/pom.xml index bf2006d..b6b9120 100644 --- a/tashow-module/tashow-module-infra/pom.xml +++ b/tashow-module/tashow-module-infra/pom.xml @@ -77,12 +77,12 @@ tashow-data-redis - +