ソースを参照

Merge branch 'volta' into test

# Conflicts:
#	launch-admin/pom.xml
#	launch-admin/src/main/java/com/webflux/launchadmin/config/AuthenticationFilter.java
#	launch-admin/src/main/java/com/webflux/launchadmin/dispatcher/MailTask.java
#	launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbIn/HomePageInController.java
#	launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/lbOut/HomePageOutController.java
#	launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewCommonOutController.java
#	launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewController.java
#	launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewOutController.java
#	launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/listening/ListeningPlanServiceImpl.java
#	launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/planNew/goGenerate/GoGenerateService.java
#	launch-admin/src/main/resources/application-prod.yml
#	launch-admin/src/test/java/com/webflux/launchadmin/LaunchAdminApplicationTests.java
volta 2 年 前
コミット
9dbc494cd9

+ 1 - 1
Dockerfile

@@ -2,7 +2,7 @@ FROM jdk21-alpine:3.18
 
 ARG env
 
-ENV ENVIRMENT=${env:+"dev"}
+#ENV ENVIRMENT=${env:+"dev"}
 ENV ENVIRMENT=${ENVIRMENT:-"prod"}
 
 COPY ./launch-admin/target/*.jar  /app/lbservice.jar

+ 1 - 2
launch-admin/src/main/java/com/webflux/launchadmin/LaunchAdminApplication.java

@@ -1,7 +1,7 @@
 package com.webflux.launchadmin;
 
 
-
+import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -9,7 +9,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @EnableTransactionManagement
 @SpringBootApplication(scanBasePackages = "com.*")
-
 @EnableScheduling
 public class LaunchAdminApplication {
 

+ 1 - 2
launch-admin/src/main/java/com/webflux/launchadmin/config/LoginWebFiter.java

@@ -64,7 +64,6 @@ public class LoginWebFiter implements WebFilter {
                BaseContextHandler.setSessionId(sessionid);
                Boolean user = getUser(getSessionid(exchange));
 
-
                if (!user) {
                    return notLogin(exchange);
                }
@@ -73,7 +72,6 @@ public class LoginWebFiter implements WebFilter {
                log.error("LoginWebFiter getUserInfo E:"+ e.getMessage());
            }
         }
-        System.out.println("...abcd");
         Mono<Void> filter = chain.filter(exchange); //放行
         //流一旦经过某个操作就会变成新流
         Mono<Void> voidMono = filter.doOnError(err -> {
@@ -146,6 +144,7 @@ public class LoginWebFiter implements WebFilter {
                         return true;
                     }
                 }else if(jsonObject.containsKey("code") && jsonObject.get("code", Integer.class) == 501){
+                    log.error("7.1");
                     return false;
                 }else {
                     return true;

+ 52 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/task/SyncDomainToRedis.java

@@ -0,0 +1,52 @@
+package com.webflux.launchadmin.mysql.task;
+
+import com.alibaba.fastjson.JSONObject;
+import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
+import com.webflux.launchadmin.mysql.entity.planNew.DomainSelect;
+import com.weblux.launchredis.utils.RedisKey;
+import jakarta.annotation.Resource;
+import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.relational.core.query.Criteria;
+import org.springframework.data.relational.core.query.Query;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+@Component
+public class SyncDomainToRedis {
+    @Resource
+    private R2dbcEntityTemplate template;
+
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
+
+    @Scheduled(cron = "0 */1 * * * ?")
+    @SchedulerLock(name = "launch:SyncDomainToRedis:syncDomain", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
+    public void syncDomain() {
+        //.更新相信信息
+        //.新增ID
+        template.select(Query.query(Criteria.where("status").is(1).and("deleted_at").isNull()), DomainSelect.class).toIterable().forEach(one -> {
+                    if (one.groupTypeId() == null || one.type() == null){
+                        return;
+                    }
+                    String idKey = RedisKey.DOMAIN_RAND_ID + one.groupTypeId() + ":" + one.type();
+                    stringRedisTemplate.opsForSet().add(idKey,String.valueOf(one.id()));
+                    stringRedisTemplate.opsForHash().put(RedisKey.DOMAIN_INFO,one.id().toString(),JSONObject.toJSONString(one));
+        });
+
+        //.移除
+        template.select(Query.query(Criteria.
+                        where("status").not(1)
+                        .or("deleted_at").isNotNull()),
+                DomainSelect.class).toIterable().forEach(one -> {
+            String idKey = RedisKey.DOMAIN_RAND_ID + ":" + one.groupTypeId() + ":" + one.type();
+            stringRedisTemplate.opsForSet().remove(idKey,String.valueOf(one.id()));
+        });
+    }
+}

+ 34 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/task/SyncPlanToRedis.java

@@ -0,0 +1,34 @@
+package com.webflux.launchadmin.mysql.task;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
+import com.weblux.launchredis.utils.RedisKey;
+import jakarta.annotation.Resource;
+import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Flux;
+@Component
+public class SyncPlanToRedis {
+    @Resource
+    private R2dbcEntityTemplate template;
+
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
+
+    @Scheduled(cron="0 */1 * * * ?")
+    @SchedulerLock(name = "launch:SyncPlanToRedis:syncListenBook", lockAtLeastFor = "PT5S", lockAtMostFor = "PT15M")
+    public void syncListenBook(){
+        Flux<ListeningPlanNew> plans = template.select(ListeningPlanNew.class).all();
+        plans.toIterable().forEach(one -> {
+            if (one.code().isEmpty()){
+                return;
+            }
+            stringRedisTemplate.opsForHash().put(RedisKey.PLAN_LISTEN_INFO,one.code(), JSONObject.toJSONString(one));
+        });
+    }
+}

+ 1 - 1
launch-admin/src/main/resources/application.yml

@@ -11,7 +11,7 @@ spring:
 
 xxl:
   sso:
-    server: https://sso.mokamrp.com/sso/login?redirect_url=https://test.space.mokamrp.com
+    server: https://sso.mokamrp.com/sso/login?redirect_url=https://test-space.mokamrp.com/#/
     excluded:
       paths: /assetManagementHugeCreatedEvent/conversion
       start: /out/,/actuator

+ 10 - 0
launch-common/pom.xml

@@ -33,6 +33,16 @@
             <artifactId>hutool-all</artifactId>
             <version>5.3.7</version>
         </dependency>
+        <dependency>
+            <groupId>net.javacrumbs.shedlock</groupId>
+            <artifactId>shedlock-spring</artifactId>
+            <version>5.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>net.javacrumbs.shedlock</groupId>
+            <artifactId>shedlock-provider-redis-spring</artifactId>
+            <version>5.1.0</version>
+        </dependency>
 
     </dependencies>
 

+ 29 - 0
launch-common/src/main/java/com/webflux/launchcommon/config/SchedulerLock.java

@@ -0,0 +1,29 @@
+package com.webflux.launchcommon.config;
+
+import net.javacrumbs.shedlock.core.LockProvider;
+import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;
+import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+
+@Configuration
+@EnableSchedulerLock(defaultLockAtMostFor = "PT55S")
+public class SchedulerLock {
+    // defaultLockAtMostFor 指定在执行节点结束时应保留锁的默认时间使用ISO8601 Duration格式
+    // 作用就是在被加锁的节点挂了时,无法释放锁,造成其他节点无法进行下一任务
+    // 这里默认55s
+    // 关于ISO8601 Duration格式用的不到,具体可上网查询下相关资料,应该就是一套规范,规定一些时间表达方式
+    public class ShedLockRedisConfig {
+        @Value("${spring.profiles.active}")
+        private String env;
+
+        @Bean
+        public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
+            // 环境变量 -需要区分不同环境避免冲突,如dev环境和test环境,两者都部署时,只有一个实例进行,此时会造成相关环境未启动情况
+            System.out.println(env);
+            return new RedisLockProvider(connectionFactory, env);
+        }
+    }
+}

+ 5 - 1
launch-redis/pom.xml

@@ -32,7 +32,11 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>3.2.0</version>
+        </dependency>
 
 
     </dependencies>

+ 73 - 0
launch-redis/src/main/java/com/weblux/launchredis/config/GlobalRedisConfig.java

@@ -0,0 +1,73 @@
+package com.weblux.launchredis.config;
+
+import cn.hutool.core.util.StrUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import redis.clients.jedis.JedisPoolConfig;
+
+/**
+ * @author: volta
+ * @Date: 2022/3/10 17:36
+ * @Description: 中台redis配置 类
+ */
+@Configuration
+public class GlobalRedisConfig {
+
+    @Value("${spring.data.redis.host}")
+    private String privateHost;
+    @Value("${spring.data.redis.port}")
+    private String privatePort;
+    @Value("${spring.data.redis.password}")
+    private String privatePassword;
+    @Value("${spring.data.redis.database}")
+    private Integer privateDB;
+
+    private static final int MAX_IDLE = 200; // 最大空闲连接数
+    private static final int MAX_TOTAL = 5024; // 最大连接数
+    private static final long MAX_WAIT_MILLIS = 10000; // 建立连接最长等待时间
+
+    @Primary
+    @Bean("stringRedisTemplate")
+    public StringRedisTemplate stringRedisTemplate() {
+        StringRedisTemplate privateStringRedisTemplate = new StringRedisTemplate();
+        privateStringRedisTemplate.setConnectionFactory(
+                connectionFactory(privateHost, Integer.parseInt(privatePort), privatePassword, MAX_IDLE, MAX_TOTAL, MAX_WAIT_MILLIS, privateDB));
+        return privateStringRedisTemplate;
+    }
+
+    // 配置工厂
+    public RedisConnectionFactory connectionFactory(String host, int port, String password, int maxIdle,
+                                                    int maxTotal, long maxWaitMillis, int index) {
+        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
+        jedisConnectionFactory.setHostName(host);
+        jedisConnectionFactory.setPort(port);
+
+        if (!StrUtil.isEmpty(password)) {
+            jedisConnectionFactory.setPassword(password);
+        }
+
+        if (index != 0) {
+            jedisConnectionFactory.setDatabase(index);
+        }
+
+        jedisConnectionFactory.setPoolConfig(poolConfig(maxIdle, maxTotal, maxWaitMillis, false));
+        jedisConnectionFactory.afterPropertiesSet();
+        return jedisConnectionFactory;
+    }
+
+    // 连接池配置
+    public JedisPoolConfig poolConfig(int maxIdle, int maxTotal, long maxWaitMillis, boolean testOnBorrow) {
+        JedisPoolConfig poolConfig = new JedisPoolConfig();
+        poolConfig.setMaxIdle(maxIdle);
+        poolConfig.setMaxTotal(maxTotal);
+        poolConfig.setMaxWaitMillis(maxWaitMillis);
+        poolConfig.setTestOnBorrow(testOnBorrow);
+        return poolConfig;
+    }
+}
+

+ 32 - 0
launch-redis/src/main/java/com/weblux/launchredis/utils/RedisKey.java

@@ -0,0 +1,32 @@
+package com.weblux.launchredis.utils;
+
+/**
+ * redis-key
+ *
+ * @author: wangcheng
+ * @date: 2024/7/12 10:06
+ */
+public class RedisKey {
+    private RedisKey() {
+    }
+
+    /**
+     * 音频缓冲
+     */
+    public static final String FISSION_AUDIO = "fission_audio:";
+
+    /** 群成员分类 */
+    public static final String GROUP_USERS_TYPE = "group_users_type:";
+
+    /** 群成员 */
+    public static final String GROUP_USERS = "group_users:";
+
+    //.计划缓存
+    public final static String PLAN_LISTEN_INFO = "sync_plan_listen_info";
+
+    //.域名随机ID
+    public final static String DOMAIN_RAND_ID = "sync_domain_rand_id:";
+
+    //.域名相信信息
+    public final static String DOMAIN_INFO = "sync_domain_info";
+}