From 8649cc207146a10b4eb3ae18fcb0fed45cc9ad4a Mon Sep 17 00:00:00 2001 From: qianbao Date: Sun, 15 Mar 2026 08:55:07 +0800 Subject: [PATCH] AI添加问题 历史问题记录 --- pom.xml | 9 +++++++++ src/main/java/com/xly/config/JedisUtil.java | 2643 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/main/java/com/xly/config/RedisConfig.java | 31 +++++++++++++++++++++++++++++++ src/main/java/com/xly/config/SpringContextHolder.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/xly/entity/AiSqlErrorHistory.java | 30 ++++++++++++++++++++++++++++++ src/main/java/com/xly/entity/AiUserAgentQuestion.java | 39 +++++++++++++++++++++++++++++++++++++++ src/main/java/com/xly/entity/UserSceneSession.java | 4 ++++ src/main/java/com/xly/service/DynamicExeDbService.java | 11 +---------- src/main/java/com/xly/service/RedisService.java | 436 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/xly/service/XlyErpService.java | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- src/main/java/com/xly/thread/AiSqlErrorHistoryThread.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/xly/thread/AiUserAgentQuestionThread.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/xly/thread/MultiThreadPoolServer.java | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/resources/application.yml | 29 ++++++++++++----------------- 14 files changed, 1010 insertions(+), 2699 deletions(-) delete mode 100644 src/main/java/com/xly/config/JedisUtil.java create mode 100644 src/main/java/com/xly/config/RedisConfig.java create mode 100644 src/main/java/com/xly/config/SpringContextHolder.java create mode 100644 src/main/java/com/xly/entity/AiSqlErrorHistory.java create mode 100644 src/main/java/com/xly/entity/AiUserAgentQuestion.java create mode 100644 src/main/java/com/xly/service/RedisService.java create mode 100644 src/main/java/com/xly/thread/AiSqlErrorHistoryThread.java create mode 100644 src/main/java/com/xly/thread/AiUserAgentQuestionThread.java create mode 100644 src/main/java/com/xly/thread/MultiThreadPoolServer.java diff --git a/pom.xml b/pom.xml index 2ba3470..7eb61bf 100644 --- a/pom.xml +++ b/pom.xml @@ -79,6 +79,15 @@ org.springframework.boot spring-boot-starter-thymeleaf + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.apache.commons + commons-pool2 + diff --git a/src/main/java/com/xly/config/JedisUtil.java b/src/main/java/com/xly/config/JedisUtil.java deleted file mode 100644 index 74acc37..0000000 --- a/src/main/java/com/xly/config/JedisUtil.java +++ /dev/null @@ -1,2643 +0,0 @@ -//package com.xly.utils.redis; -// -//import java.io.ByteArrayInputStream; -//import java.io.ByteArrayOutputStream; -//import java.io.ObjectInputStream; -//import java.io.ObjectOutputStream; -//import java.util.*; -//import java.util.concurrent.TimeUnit; -// -//import cn.hutool.core.util.StrUtil; -//import cn.hutool.json.JSONUtil; -//import com.alibaba.fastjson.JSONObject; -//import com.google.common.collect.Sets; -//import groovy.util.logging.Slf4j; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.cache.annotation.Cacheable; -//import org.springframework.stereotype.Component; -// -//import org.springframework.util.ObjectUtils; -//import redis.clients.jedis.*; -//import redis.clients.jedis.BinaryClient.LIST_POSITION; -// -//@Component -//@Slf4j -//public class JedisUtil { -// -// private static final Logger logger = LoggerFactory.getLogger(JedisUtil.class); -// -// private static final String LOCK_SUCCESS = "OK"; -// private static final String SET_IF_NOT_EXIST = "NX"; -// private static final String SET_WITH_EXPIRE_TIME = "PX"; -// private static final String SET_WITH_EXPIRE_TIME_EX = "EX"; -// private static final Long RELEASE_SUCCESS = 1L; -// public static final int lockWaitTime = 4000; -// public static final int scanlimit = 10000; -// -// @Value("${spring.redis.database}") -// private int indexdb; -// -// @Autowired -// private JedisPool jedisPool; -// -// /** -// *

-// * 通过key获取储存在redis中的value -// *

-// *

-// * 并释放连接 -// *

-// * -// * @param key -// * @return 成功返回value 失败返回null -// */ -// public String get(String key) { -// Jedis jedis = null; -// String value = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// value = jedis.get(key); -// } catch (Exception e) { -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return value; -// } -// /** -// *

-// * 通过key获取储存在redis中的value -// *

-// *

-// * 并释放连接 -// *

-// * -// * @param key -// * @return 成功返回value 失败返回null -// */ -// public Object getObject(String key) { -// Jedis jedis = null; -// Object value = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// String jedV = jedis.get(key); -// if(StrUtil.isNotEmpty(jedV) && JSONUtil.isJsonObj(jedV)){ -// value = JSONUtil.parseObj(jedV); -// }else{ -// value = jedV; -// } -// } catch (Exception e) { -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return value; -// } -// -// /** -// * 递增 -// * @param key 键 -// * @return -// */ -// public long incr(String key, long delta){ -// if(delta<0){ -// throw new RuntimeException("递增因子必须大于0"); -// } -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.incrBy(key,delta); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 通过key获取储存在redis中的value -// *

-// *

-// * 并释放连接 -// *

-// * -// * @param key -// * @param indexdb 选择redis库 0-15 -// * @return 成功返回value 失败返回null -// */ -// public byte[] get(byte[] key, int indexdb) { -// Jedis jedis = null; -// byte[] value = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// value = jedis.get(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return value; -// } -// -// /** -// *

-// * 向redis存入key和value,并释放连接资源 -// *

-// *

-// * 如果key已经存在 则覆盖 -// *

-// * -// * @param key -// * @param value -// * @param indexdb 选择redis库 0-15 -// * @return 成功 返回OK 失败返回 0 -// */ -// public String set(String key, String value, int indexdb) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.set(key, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return "0"; -// } finally { -// returnResource(jedis); -// } -// } -// /** -// *

-// * 向redis存入key和value,并释放连接资源 -// *

-// *

-// * 如果key已经存在 则覆盖 -// *

-// * -// * @param key -// * @param value -// * @return 成功 返回OK 失败返回 0 -// */ -// public String set(String key, String value) { -// return set( key, value, indexdb); -// } -// /** -// *

-// * 向redis存入key和value,并释放连接资源 -// *

-// *

-// * 如果key已经存在 则覆盖 -// *

-// * -// * @param key -// * @param value -// * @return 成功 返回OK 失败返回 0 -// */ -// public String setObject(String key, Object value) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// String objJson = JSONUtil.toJsonStr(value); -// return jedis.set( key,objJson); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return "0"; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 向redis存入key和value,并释放连接资源 -// *

-// *

-// * 如果key已经存在 则覆盖 -// *

-// * -// * @param key -// * @param value -// * @param indexdb 选择redis库 0-15 -// * @return 成功 返回OK 失败返回 0 -// */ -// public String set(byte[] key, byte[] value, int indexdb) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.set(key, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return "0"; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 删除指定的key,也可以传入一个包含key的数组 -// *

-// * -// * @param keys 一个key 也可以使 string 数组 -// * @return 返回删除成功的个数 -// */ -// public Long del(String... keys) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.del(keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// /** -// *

-// * 删除指定的key,也可以传入一个包含key的数组 -// *

-// * -// * @param keysSet 一个key 也可以使 string 数组 -// * @return 返回删除成功的个数 -// */ -// public Long delSet(Set keysSet) { -// return del(keysSet.toArray(new String[keysSet.size()])); -// } -// -// /** -// *

-// * 删除指定的key,也可以传入一个包含key的数组 -// *

-// * -// * @param indexdb 选择redis库 0-15 -// * @param keys 一个key 也可以使 string 数组 -// * @return 返回删除成功的个数 -// */ -// public Long del(int indexdb, String... keys) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.del(keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 删除指定的key,也可以传入一个包含key的数组 -// *

-// * -// * @param indexdb 选择redis库 0-15 -// * @param keys 一个key 也可以使 string 数组 -// * @return 返回删除成功的个数 -// */ -// public Long del(int indexdb, byte[]... keys) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.del(keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 通过key向指定的value值追加值 -// *

-// * -// * @param key -// * @param str -// * @return 成功返回 添加后value的长度 失败 返回 添加的 value 的长度 异常返回0L -// */ -// public Long append(String key, String str) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.append(key, str); -// } catch (Exception e) { -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 判断key是否存在 -// *

-// * -// * @param key -// * @return true OR false -// */ -// public Boolean exists(String key) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.exists(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return false; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 清空当前数据库中的所有 key,此命令从不失败。 -// *

-// * -// * @return 总是返回 OK -// */ -// public String flushDB() { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.flushDB(); -// } catch (Exception e) { -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// -// /** -// *

-// * 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。 -// *

-// * -// * @param key -// * @param value 过期时间,单位:秒 -// * @return 成功返回1 如果存在 和 发生异常 返回 0 -// */ -// public Long expire(String key, int value, int indexdb) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.expire(key, value); -// } catch (Exception e) { -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// * 普通缓存放入并设置时间 -// * @param key 键 -// * @param value 值 -// * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 -// * @return true成功 false 失败 -// */ -// public boolean setObjectExpire(String key,Object value,long time){ -// String valueJson = JSONUtil.toJsonStr(value); -// this.setex( key, new Long(time).intValue(), valueJson); -// return true; -// } -// -// /** -// *

-// * 以秒为单位,返回给定 key 的剩余生存时间 -// *

-// * -// * @param key -// * @return 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key -// * 的剩余生存时间。 发生异常 返回 0 -// */ -// public Long ttl(String key, int indexdb) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.ttl(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// /** -// * 普通缓存放入并设置时间 -// * @param key 键 -// * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 -// * @return true成功 false 失败 -// */ -// public Long expireSeconds(String key,long time){ -// return expire( key, new Long(time).intValue(), indexdb); -// } -// /** -// * 普通缓存放入并设置时间 -// * @param key 键 -// * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 -// * @return true成功 false 失败 -// */ -// public Long expireMinutes(String key,long time){ -// time = time * 60; -// return expire( key, new Long(time).intValue(), indexdb); -// } -// /** -// * 普通缓存放入并设置时间 -// * @param key 键 -// * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 -// * @return true成功 false 失败 -// */ -// public String createAndExpireMinutes(String key,String value,long time){ -// return setexMinutes(key,new Long(time).intValue(), value); -// } -// -// /** -// *

-// * 移除给定 key 的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key ) -// *

-// * -// * @param key -// * @return 当生存时间移除成功时,返回 1 .如果 key 不存在或 key 没有设置生存时间,返回 0 , 发生异常 返回 -1 -// */ -// public Long persist(String key) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.persist(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return -1L; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 新增key,并将 key 的生存时间 (以秒为单位) -// *

-// * -// * @param key -// * @param seconds 生存时间 单位:秒 -// * @param value -// * @return 设置成功时返回 OK 。当 seconds 参数不合法时,返回一个错误。 -// */ -// public String setex(String key, int seconds, String value) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.setex(key, seconds, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// /** -// *

-// * 新增key,并将 key 的生存时间 (以秒为单位) -// *

-// * -// * @param key -// * @param seconds 生存时间 单位:秒 -// * @param value -// * @return 设置成功时返回 OK 。当 seconds 参数不合法时,返回一个错误。 -// */ -// public String setexMinutes(String key, int seconds, String value) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// seconds = seconds*60; -// return jedis.setex(key, seconds, value); -// } catch (Exception e) { -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// -// /** -// *

-// * 设置key value,如果key已经存在则返回0,nx==> not exist -// *

-// * -// * @param key -// * @param value -// * @return 成功返回1 如果存在 和 发生异常 返回 0 -// */ -// public Long setnx(String key, String value) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.setnx(key, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 -// *

-// *

-// * 当 key 存在但不是字符串类型时,返回一个错误。 -// *

-// * -// * @param key -// * @param value -// * @return 返回给定 key 的旧值。当 key 没有旧值时,也即是, key 不存在时,返回 nil -// */ -// public String getSet(String key, String value) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.getSet(key, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// -// /** -// *

-// * 设置key value并制定这个键值的有效期 -// *

-// * -// * @param key -// * @param value -// * @param seconds 单位:秒 -// * @return 成功返回OK 失败和异常返回null -// */ -// public String setex(String key, String value, int seconds) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.setex(key, seconds, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key 和offset 从指定的位置开始将原先value替换 -// *

-// *

-// * 下标从0开始,offset表示从offset下标开始替换 -// *

-// *

-// * 如果替换的字符串长度过小则会这样 -// *

-// *

-// * example: -// *

-// *

-// * value : bigsea@zto.cn -// *

-// *

-// * str : abc -// *

-// *

-// * 从下标7开始替换 则结果为 -// *

-// *

-// * RES : bigsea.abc.cn -// *

-// * -// * @param key -// * @param str -// * @param offset 下标位置 -// * @return 返回替换后 value 的长度 -// */ -// public Long setrange(String key, String str, int offset) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.setrange(key, offset, str); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// } -// -// /** -// *

-// * 通过批量的key获取批量的value -// *

-// * -// * @param keys string数组 也可以是一个key -// * @return 成功返回value的集合, 失败返回null的集合 ,异常返回空 -// */ -// public List mget(String... keys) { -// Jedis jedis = null; -// List values = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// values = jedis.mget(keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return values; -// } -// -// /** -// *

-// * 批量的设置key:value,可以一个 -// *

-// *

-// * example: -// *

-// *

-// * obj.mset(new String[]{"key2","value1","key2","value2"}) -// *

-// * -// * @param keysvalues -// * @return 成功返回OK 失败 异常 返回 null -// */ -// public String mset(String... keysvalues) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.mset(keysvalues); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 批量的设置key:value,可以一个,如果key已经存在则会失败,操作会回滚 -// *

-// *

-// * example: -// *

-// *

-// * obj.msetnx(new String[]{"key2","value1","key2","value2"}) -// *

-// * -// * @param keysvalues -// * @return 成功返回1 失败返回0 -// */ -// public Long msetnx(String... keysvalues) { -// Jedis jedis = null; -// Long res = 0L; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.msetnx(keysvalues); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 设置key的值,并返回一个旧值 -// *

-// * -// * @param key -// * @param value -// * @return 旧值 如果key不存在 则返回null -// */ -// public String getset(String key, String value) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.getSet(key, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过下标 和key 获取指定下标位置的 value -// *

-// * -// * @param key -// * @param startOffset 开始位置 从0 开始 负数表示从右边开始截取 -// * @param endOffset -// * @return 如果没有返回null -// */ -// public String getrange(String key, int startOffset, int endOffset) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.getrange(key, startOffset, endOffset); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key 对value进行加值+1操作,当value不是int类型时会返回错误,当key不存在是则value为1 -// *

-// * -// * @param key -// * @return 加值后的结果 -// */ -// public Long incr(String key) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.incr(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key给指定的value加值,如果key不存在,则这是value为该值 -// *

-// * -// * @param key -// * @param integer -// * @return -// */ -// public Long incrBy(String key, Long integer) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.incrBy(key, integer); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 对key的值做减减操作,如果key不存在,则设置key为-1 -// *

-// * -// * @param key -// * @return -// */ -// public Long decr(String key) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.decr(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 减去指定的值 -// *

-// * -// * @param key -// * @param integer -// * @return -// */ -// public Long decrBy(String key, Long integer) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.decrBy(key, integer); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取value值的长度 -// *

-// * -// * @param key -// * @return 失败返回null -// */ -// public Long serlen(String key) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.strlen(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key给field设置指定的值,如果key不存在,则先创建 -// *

-// * -// * @param key -// * @param field 字段 -// * @param value -// * @return 如果存在返回0 异常返回null -// */ -// public Long hset(String key, String field, String value) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hset(key, field, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key给field设置指定的值,如果key不存在则先创建,如果field已经存在,返回0 -// *

-// * -// * @param key -// * @param field -// * @param value -// * @return -// */ -// public Long hsetnx(String key, String field, String value) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hsetnx(key, field, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key同时设置 hash的多个field -// *

-// * -// * @param key -// * @param hash -// * @return 返回OK 异常返回null -// */ -// public String hmset(String key, Map hash, int indexdb) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hmset(key, hash); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key 和 field 获取指定的 value -// *

-// * -// * @param key -// * @param field -// * @return 没有返回null -// */ -// public String hget(String key, String field) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hget(key, field); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key 和 fields 获取指定的value 如果没有对应的value则返回null -// *

-// * -// * @param key -// * @param fields 可以使 一个String 也可以是 String数组 -// * @return -// */ -// public List hmget(String key, int indexdb, String... fields) { -// Jedis jedis = null; -// List res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hmget(key, fields); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key给指定的field的value加上给定的值 -// *

-// * -// * @param key -// * @param field -// * @param value -// * @return -// */ -// public Long hincrby(String key, String field, Long value) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hincrBy(key, field, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key和field判断是否有指定的value存在 -// *

-// * -// * @param key -// * @param field -// * @return -// */ -// public Boolean hexists(String key, String field) { -// Jedis jedis = null; -// Boolean res = false; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hexists(key, field); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回field的数量 -// *

-// * -// * @param key -// * @return -// */ -// public Long hlen(String key) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hlen(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// -// } -// -// /** -// *

-// * 通过key 删除指定的 field -// *

-// * -// * @param key -// * @param fields 可以是 一个 field 也可以是 一个数组 -// * @return -// */ -// public Long hdel(String key, String... fields) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hdel(key, fields); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回所有的field -// *

-// * -// * @param key -// * @return -// */ -// public Set hkeys(String key) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hkeys(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回所有和key有关的value -// *

-// * -// * @param key -// * @return -// */ -// public List hvals(String key) { -// Jedis jedis = null; -// List res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hvals(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取所有的field和value -// *

-// * -// * @param key -// * @return -// */ -// public Map hgetall(String key, int indexdb) { -// Jedis jedis = null; -// Map res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.hgetAll(key); -// } catch (Exception e) { -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key向list头部添加字符串 -// *

-// * -// * @param key -// * @param strs 可以使一个string 也可以使string数组 -// * @return 返回list的value个数 -// */ -// public Long lpush(int indexdb, String key, String... strs) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.lpush(key, strs); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key向list尾部添加字符串 -// *

-// * -// * @param key -// * @param strs 可以使一个string 也可以使string数组 -// * @return 返回list的value个数 -// */ -// public Long rpush(String key, String... strs) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.rpush(key, strs); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key在list指定的位置之前或者之后 添加字符串元素 -// *

-// * -// * @param key -// * @param where LIST_POSITION枚举类型 -// * @param pivot list里面的value -// * @param value 添加的value -// * @return -// */ -// public Long linsert(String key, LIST_POSITION where, String pivot, -// String value) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.linsert(key, where, pivot, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key设置list指定下标位置的value -// *

-// *

-// * 如果下标超过list里面value的个数则报错 -// *

-// * -// * @param key -// * @param index 从0开始 -// * @param value -// * @return 成功返回OK -// */ -// public String lset(String key, Long index, String value) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.lset(key, index, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key从对应的list中删除指定的count个 和 value相同的元素 -// *

-// * -// * @param key -// * @param count 当count为0时删除全部 -// * @param value -// * @return 返回被删除的个数 -// */ -// public Long lrem(String key, long count, String value) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.lrem(key, count, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key保留list中从strat下标开始到end下标结束的value值 -// *

-// * -// * @param key -// * @param start -// * @param end -// * @return 成功返回OK -// */ -// public String ltrim(String key, long start, long end) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.ltrim(key, start, end); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key从list的头部删除一个value,并返回该value -// *

-// * -// * @param key -// * @return -// */ -// synchronized public String lpop(String key) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.lpop(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key从list尾部删除一个value,并返回该元素 -// *

-// * -// * @param key -// * @return -// */ -// synchronized public String rpop(String key, int indexdb) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.rpop(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key从一个list的尾部删除一个value并添加到另一个list的头部,并返回该value -// *

-// *

-// * 如果第一个list为空或者不存在则返回null -// *

-// * -// * @param srckey -// * @param dstkey -// * @return -// */ -// public String rpoplpush(String srckey, String dstkey, int indexdb) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.rpoplpush(srckey, dstkey); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取list中指定下标位置的value -// *

-// * -// * @param key -// * @param index -// * @return 如果没有返回null -// */ -// public String lindex(String key, long index) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.lindex(key, index); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回list的长度 -// *

-// * -// * @param key -// * @return -// */ -// public Long llen(String key) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.llen(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取list指定下标位置的value -// *

-// *

-// * 如果start 为 0 end 为 -1 则返回全部的list中的value -// *

-// * -// * @param key -// * @param start -// * @param end -// * @return -// */ -// public List lrange(String key, long start, long end, int indexdb) { -// Jedis jedis = null; -// List res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.lrange(key, start, end); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 将列表 key 下标为 index 的元素的值设置为 value -// *

-// * -// * @param key -// * @param index -// * @param value -// * @return 操作成功返回 ok ,否则返回错误信息 -// */ -// public String lset(String key, long index, String value) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.lset(key, index, value); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// -// /** -// *

-// * 返回给定排序后的结果 -// *

-// * -// * @param key -// * @param sortingParameters -// * @return 返回列表形式的排序结果 -// */ -// public List sort(String key, SortingParams sortingParameters) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.sort(key, sortingParameters); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// -// /** -// *

-// * 返回排序后的结果,排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。 -// *

-// * -// * @param key -// * @return 返回列表形式的排序结果 -// */ -// public List sort(String key) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.sort(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// -// /** -// *

-// * 通过key向指定的set中添加value -// *

-// * -// * @param key -// * @param members 可以是一个String 也可以是一个String数组 -// * @return 添加成功的个数 -// */ -// public Long sadd(String key, String... members) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sadd(key, members); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key删除set中对应的value值 -// *

-// * -// * @param key -// * @param members 可以是一个String 也可以是一个String数组 -// * @return 删除的个数 -// */ -// public Long srem(String key, String... members) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.srem(key, members); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key随机删除一个set中的value并返回该值 -// *

-// * -// * @param key -// * @return -// */ -// public String spop(String key) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.spop(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取set中的差集 -// *

-// *

-// * 以第一个set为标准 -// *

-// * -// * @param keys 可以使一个string 则返回set中所有的value 也可以是string数组 -// * @return -// */ -// public Set sdiff(String... keys) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sdiff(keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取set中的差集并存入到另一个key中 -// *

-// *

-// * 以第一个set为标准 -// *

-// * -// * @param dstkey 差集存入的key -// * @param keys 可以使一个string 则返回set中所有的value 也可以是string数组 -// * @return -// */ -// public Long sdiffstore(String dstkey, String... keys) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sdiffstore(dstkey, keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取指定set中的交集 -// *

-// * -// * @param keys 可以使一个string 也可以是一个string数组 -// * @return -// */ -// public Set sinter(String... keys) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sinter(keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取指定set中的交集 并将结果存入新的set中 -// *

-// * -// * @param dstkey -// * @param keys 可以使一个string 也可以是一个string数组 -// * @return -// */ -// public Long sinterstore(String dstkey, String... keys) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sinterstore(dstkey, keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回所有set的并集 -// *

-// * -// * @param keys 可以使一个string 也可以是一个string数组 -// * @return -// */ -// public Set sunion(String... keys) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sunion(keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回所有set的并集,并存入到新的set中 -// *

-// * -// * @param dstkey -// * @param keys 可以使一个string 也可以是一个string数组 -// * @return -// */ -// public Long sunionstore(String dstkey, String... keys) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sunionstore(dstkey, keys); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key将set中的value移除并添加到第二个set中 -// *

-// * -// * @param srckey 需要移除的 -// * @param dstkey 添加的 -// * @param member set中的value -// * @return -// */ -// public Long smove(String srckey, String dstkey, String member) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.smove(srckey, dstkey, member); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取set中value的个数 -// *

-// * -// * @param key -// * @return -// */ -// public Long scard(String key) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.scard(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key判断value是否是set中的元素 -// *

-// * -// * @param key -// * @param member -// * @return -// */ -// public Boolean sismember(String key, String member) { -// Jedis jedis = null; -// Boolean res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.sismember(key, member); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取set中随机的value,不删除元素 -// *

-// * -// * @param key -// * @return -// */ -// public String srandmember(String key) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.srandmember(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取set中所有的value -// *

-// * -// * @param key -// * @return -// */ -// public Set smembers(String key) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.smembers(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key向zset中添加value,score,其中score就是用来排序的 -// *

-// *

-// * 如果该value已经存在则根据score更新元素 -// *

-// * -// * @param key -// * @param score -// * @param member -// * @return -// */ -// public Long zadd(String key, double score, String member) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zadd(key, score, member); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 返回有序集 key 中,指定区间内的成员。min=0,max=-1代表所有元素 -// *

-// * -// * @param key -// * @param min -// * @param max -// * @return 指定区间内的有序集成员的列表。 -// */ -// public Set zrange(String key, long min, long max) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.zrange(key, min, max); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return null; -// } -// -// /** -// *

-// * 统计有序集 key 中,值在 min 和 max 之间的成员的数量 -// *

-// * -// * @param key -// * @param min -// * @param max -// * @return 值在 min 和 max 之间的成员的数量。异常返回0 -// */ -// public Long zcount(String key, double min, double max) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.zcount(key, min, max); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// -// } -// -// /** -// *

-// * 为哈希表 key 中的域 field 的值加上增量 increment 。增量也可以为负数,相当于对给定域进行减法操作。 如果 key -// * 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。 -// * 对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。本操作的值被限制在 64 位(bit)有符号数字表示之内。 -// *

-// *

-// * 将名称为key的hash中field的value增加integer -// *

-// * -// * @param key -// * @param value -// * @param increment -// * @return 执行 HINCRBY 命令之后,哈希表 key 中域 field的值。异常返回0 -// */ -// public Long hincrBy(String key, String value, long increment) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// return jedis.hincrBy(key, value, increment); -// } catch (Exception e) { -// logger.error(e.getMessage()); -// return 0L; -// } finally { -// returnResource(jedis); -// } -// -// } -// -// /** -// *

-// * 通过key删除在zset中指定的value -// *

-// * -// * @param key -// * @param members 可以使一个string 也可以是一个string数组 -// * @return -// */ -// public Long zrem(String key, String... members) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zrem(key, members); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key增加该zset中value的score的值 -// *

-// * -// * @param key -// * @param score -// * @param member -// * @return -// */ -// public Double zincrby(String key, double score, String member) { -// Jedis jedis = null; -// Double res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zincrby(key, score, member); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回zset中value的排名 -// *

-// *

-// * 下标从小到大排序 -// *

-// * -// * @param key -// * @param member -// * @return -// */ -// public Long zrank(String key, String member) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zrank(key, member); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回zset中value的排名 -// *

-// *

-// * 下标从大到小排序 -// *

-// * -// * @param key -// * @param member -// * @return -// */ -// public Long zrevrank(String key, String member) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zrevrank(key, member); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key将获取score从start到end中zset的value -// *

-// *

-// * socre从大到小排序 -// *

-// *

-// * 当start为0 end为-1时返回全部 -// *

-// * -// * @param key -// * @param start -// * @param end -// * @return -// */ -// public Set zrevrange(String key, long start, long end) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zrevrange(key, start, end); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回指定score内zset中的value -// *

-// * -// * @param key -// * @param max -// * @param min -// * @return -// */ -// public Set zrangebyscore(String key, String max, String min) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zrevrangeByScore(key, max, min); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回指定score内zset中的value -// *

-// * -// * @param key -// * @param max -// * @param min -// * @return -// */ -// public Set zrangeByScore(String key, double max, double min) { -// Jedis jedis = null; -// Set res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zrevrangeByScore(key, max, min); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 返回指定区间内zset中value的数量 -// *

-// * -// * @param key -// * @param min -// * @param max -// * @return -// */ -// public Long zcount(String key, String min, String max) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zcount(key, min, max); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key返回zset中的value个数 -// *

-// * -// * @param key -// * @return -// */ -// public Long zcard(String key) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zcard(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key获取zset中value的score值 -// *

-// * -// * @param key -// * @param member -// * @return -// */ -// public Double zscore(String key, String member) { -// Jedis jedis = null; -// Double res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zscore(key, member); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key删除给定区间内的元素 -// *

-// * -// * @param key -// * @param start -// * @param end -// * @return -// */ -// public Long zremrangeByRank(String key, long start, long end) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zremrangeByRank(key, start, end); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// *

-// * 通过key删除指定score内的元素 -// *

-// * -// * @param key -// * @param start -// * @param end -// * @return -// */ -// public Long zremrangeByScore(String key, double start, double end) { -// Jedis jedis = null; -// Long res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.zremrangeByScore(key, start, end); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /**返回满足pattern表达式的所有 key*/ -// public Set keys(String pattern) { -// Set res = this.scan(pattern); -// return res; -// } -// -// /** -// * key模糊查找 -// * @param keys 要查找的key 例: aaa* ,aaa开头的所有key -// * @return 匹配到的key集合 -// */ -// public Set scan(String keys) { -// return scan(keys,scanlimit); -// } -// -// /** -// * 根据match 查询redis中中的所有key -// * @param match input the argument "ONLINE_*" -// * @param limit 每次查询个数,不要太大 -// */ -// public Set scan(String match,int limit) { -// HashSet keySet = Sets.newHashSet(); -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// //指定规则 -// ScanParams scanParams = new ScanParams().match(match).count(limit); -// boolean hasNext = true; -// //第一次查询的游标 -// String cursor = "0"; -// while (hasNext) { -// ScanResult scanResult = jedis.scan(cursor,scanParams); -// //返回当前查询的key -// List keyList = scanResult.getResult(); -// keySet.addAll(keyList); -// -// cursor = scanResult.getStringCursor(); -// if ("0".equals(cursor)) { -// hasNext = false; -// } -// } -// } catch (Exception e) { -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return keySet; -// } -// -// /** -// *

-// * 通过key判断值得类型 -// *

-// * -// * @param key -// * @return -// */ -// public String type(String key) { -// Jedis jedis = null; -// String res = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// res = jedis.type(key); -// } catch (Exception e) { -// -// logger.error(e.getMessage()); -// } finally { -// returnResource(jedis); -// } -// return res; -// } -// -// /** -// * 序列化对象 -// * -// * @param obj -// * @return 对象需实现Serializable接口 -// */ -// public static byte[] ObjTOSerialize(Object obj) { -// ObjectOutputStream oos = null; -// ByteArrayOutputStream byteOut = null; -// try { -// byteOut = new ByteArrayOutputStream(); -// oos = new ObjectOutputStream(byteOut); -// oos.writeObject(obj); -// byte[] bytes = byteOut.toByteArray(); -// return bytes; -// } catch (Exception e) { -// } -// return null; -// } -// -// /** -// * 反序列化对象 -// * -// * @param bytes -// * @return 对象需实现Serializable接口 -// */ -// public static Object unserialize(byte[] bytes) { -// ByteArrayInputStream bais = null; -// try { -// //反序列化 -// bais = new ByteArrayInputStream(bytes); -// ObjectInputStream ois = new ObjectInputStream(bais); -// return ois.readObject(); -// } catch (Exception e) { -// } -// return null; -// } -// -// /** -// * 返还到连接池 -// * -// * @param jedis -// */ -// public static void returnResource(Jedis jedis) { -// if (jedis != null) { -// jedis.close(); -// } -// } -// -// /** -// * jedis 上锁 -// * @param lockKey -// * @param requestId 锁的值 -// * @param expireTime -// * @return -// */ -// public boolean tryLock(String lockKey, String requestId, int expireTime) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME_EX, expireTime); -// if (LOCK_SUCCESS.equals(result)) { -// return true; -// } -// } catch (Exception e) { -// e.printStackTrace(); -// return false; -// } finally { -// returnResource(jedis); -// } -// return false; -// } -// /** -// * jedis 上锁 -// * @param lockKey -// * @param requestId 锁的值 -// * @param expireTime -// * @return -// */ -// public boolean tryLockSec(String lockKey, String requestId, int expireTime) { -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME_EX, expireTime); -// if (LOCK_SUCCESS.equals(result)) { -// return true; -// } -// } catch (Exception e) { -// e.printStackTrace(); -// return false; -// } finally { -// returnResource(jedis); -// } -// return false; -// } -// /** -// * jedis 上锁 -// * @param lockKey -// * @param requestId 锁的值 -// * @return -// */ -// public boolean tryLock(String lockKey, String requestId) { -// return this.tryLock( lockKey, requestId, lockWaitTime); -// } -// -// -// /** -// * jedis 上锁没返回 -// * @param lockKey -// * @param requestId -// * @param expireTime -// */ -// public void lock(String lockKey, String requestId, int expireTime) { -// while (true) { -// if (tryLock(lockKey, requestId, expireTime)) { -// return; -// } -// } -// } -// -// /** -// * jedis解锁 -// * @param lockKey -// * @param requestId -// * @return -// */ -// public boolean unLock(String lockKey, String requestId) { -// String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; -// Jedis jedis = null; -// try { -// jedis = jedisPool.getResource(); -// jedis.select(indexdb); -// Object result = jedis.eval(script, Collections.singletonList(lockKey), -// Collections.singletonList(requestId)); -// if (RELEASE_SUCCESS.equals(result)) { -// System.out.println("unlock "+ Thread.currentThread().getName()+ " requestId:" + requestId); -// return true; -// } -// jedis.del(lockKey); -// } catch (Exception e) { -// throw e; -// } finally { -// returnResource(jedis); -// } -// return false; -// } -// -// -// @Cacheable(value="getSelectRedis" ,key="#sCacheableName") -// public List> getSelectRedis(String sCacheableName,List> selectDate) { -// return selectDate; -// } -// -// public static void main(String[] args) { -// /*JedisPool jedisPool = new JedisPool(null,"localhost",6379,100,"123456"); -// Jedis jedis = jedisPool.getResource(); -// //r.get("", RedisConstants.datebase4); -// jedis.select(RedisConstants.datebase4); -// Set str = jedis.keys("*"); -// for (String string : str) { -// System.out.println(string); -// }*/ -// } -//} \ No newline at end of file diff --git a/src/main/java/com/xly/config/RedisConfig.java b/src/main/java/com/xly/config/RedisConfig.java new file mode 100644 index 0000000..b68afb2 --- /dev/null +++ b/src/main/java/com/xly/config/RedisConfig.java @@ -0,0 +1,31 @@ +package com.xly.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + + // key 采用 String 序列化 + template.setKeySerializer(new StringRedisSerializer()); + // hash 的 key 也采用 String 序列化 + template.setHashKeySerializer(new StringRedisSerializer()); + + // value 采用 Jackson 序列化 + GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(); + template.setValueSerializer(jsonSerializer); + template.setHashValueSerializer(jsonSerializer); + + template.afterPropertiesSet(); + return template; + } +} \ No newline at end of file diff --git a/src/main/java/com/xly/config/SpringContextHolder.java b/src/main/java/com/xly/config/SpringContextHolder.java new file mode 100644 index 0000000..f3c332c --- /dev/null +++ b/src/main/java/com/xly/config/SpringContextHolder.java @@ -0,0 +1,80 @@ +package com.xly.config; + +import org.apache.commons.lang3.Validate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +/** + * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext. + */ +@Service +@Lazy(false) +public class SpringContextHolder implements ApplicationContextAware, DisposableBean { + + private static ApplicationContext applicationContext = null; + + private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class); + + /** + * 取得存储在静态变量中的ApplicationContext. + */ + public static ApplicationContext getApplicationContext() { + assertContextInjected(); + return applicationContext; + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) { + assertContextInjected(); + return (T) applicationContext.getBean(name); + } + + /** + * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(Class requiredType) { + assertContextInjected(); + return applicationContext.getBean(requiredType); + } + + /** + * 清除SpringContextHolder中的ApplicationContext为Null. + */ + public static void clearHolder() { + if (logger.isDebugEnabled()){ + logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); + } + applicationContext = null; + } + + /** + * 实现ApplicationContextAware接口, 注入Context到静态变量中. + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + SpringContextHolder.applicationContext = applicationContext; + } + + /** + * 实现DisposableBean接口, 在Context关闭时清理静态变量. + */ + @Override + public void destroy() throws Exception { + SpringContextHolder.clearHolder(); + } + + /** + * 检查ApplicationContext不为空. + */ + private static void assertContextInjected() { + Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder."); + } +} \ No newline at end of file diff --git a/src/main/java/com/xly/entity/AiSqlErrorHistory.java b/src/main/java/com/xly/entity/AiSqlErrorHistory.java new file mode 100644 index 0000000..1b5eb38 --- /dev/null +++ b/src/main/java/com/xly/entity/AiSqlErrorHistory.java @@ -0,0 +1,30 @@ +package com.xly.entity; + +import cn.hutool.core.util.StrUtil; +import lombok.Data; + +import java.util.Date; + +@Data +public class AiSqlErrorHistory { + + private Integer iIncrement; + private String sId; + private Integer iOrder; + private Date tCreateDate; + private String sBrandsId; + private String sSubsidiaryId; + private String sMakePerson; + private String sBillNo; + private String sFormId= StrUtil.EMPTY; + private Integer sStatus; + private String sSceneId; + private String sMethodId; + private String sQuestion; + private String sError_sql; + private String sError_mes; + private String sCorrect_sql; + private Boolean bCheck = false; + private Boolean bInvalid = false; + private String sLoginId; +} diff --git a/src/main/java/com/xly/entity/AiUserAgentQuestion.java b/src/main/java/com/xly/entity/AiUserAgentQuestion.java new file mode 100644 index 0000000..f4bf104 --- /dev/null +++ b/src/main/java/com/xly/entity/AiUserAgentQuestion.java @@ -0,0 +1,39 @@ +package com.xly.entity; + +import cn.hutool.core.util.StrUtil; +import lombok.Data; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Data +public class AiUserAgentQuestion { + + private Integer iIncrement; + private String sId; + private Integer iOrder; + private Date tCreateDate; + private String sBrandsId; + private String sSubsidiaryId; + private String sMakePerson; + private String sBillNo; + private String sFormId= StrUtil.EMPTY; + private Integer sStatus; + private String sSceneId; + private String sMethodId; + private String sQuestion; + private String sSqlContent; + private Boolean bCheck = false; + private Boolean bInvalid = false; + private String sLoginId; + private String sQuestionGroupNo; + private Boolean bRedis = false; + private Date tUpdateDate; + private Integer iUpdate; + + + + + +} diff --git a/src/main/java/com/xly/entity/UserSceneSession.java b/src/main/java/com/xly/entity/UserSceneSession.java index b200072..b1c1965 100644 --- a/src/main/java/com/xly/entity/UserSceneSession.java +++ b/src/main/java/com/xly/entity/UserSceneSession.java @@ -29,6 +29,10 @@ public class UserSceneSession { * 该用户权限内可访问的所有场景(从权限映射中获取) */ private List authScenes; + /*** + * 用户问题集合 + **/ + private List sUserQuestionList; private List authTool; /** diff --git a/src/main/java/com/xly/service/DynamicExeDbService.java b/src/main/java/com/xly/service/DynamicExeDbService.java index 6c88414..d0e89a5 100644 --- a/src/main/java/com/xly/service/DynamicExeDbService.java +++ b/src/main/java/com/xly/service/DynamicExeDbService.java @@ -214,16 +214,7 @@ public class DynamicExeDbService { public Map getDoProMap(String sProName, Map params) throws BusinessException{ Map searMap = new HashMap<>(4); try{ - //根据过程名称获取过程参数 - //添加公司子公司 -// if((ObjectUtil.isEmpty(params.get("sBrId")) -// || ObjectUtil.isEmpty(params.get("sSuId")))){ -// params.put("sBrId",params.get("sBrandsId")); -// params.put("sSuId",params.get("sSubsidiaryId")); -// } -// if(ObjectUtil.isEmpty(params.get("sLoginId"))){ -// params.put("sLoginId",params.get("sUserId")); -// } + List> proList = getProcParam( sProName); //{CALL mytest(#{ownerid,mode=IN,jdbcType=INTEGER},#{examcount,mode=OUT,jdbcType=INTEGER})} StringBuffer sb = new StringBuffer(); diff --git a/src/main/java/com/xly/service/RedisService.java b/src/main/java/com/xly/service/RedisService.java new file mode 100644 index 0000000..7a998d7 --- /dev/null +++ b/src/main/java/com/xly/service/RedisService.java @@ -0,0 +1,436 @@ +package com.xly.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.*; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service("redisService") +@RequiredArgsConstructor +public class RedisService { + + @Autowired + private RedisTemplate redisTemplate; + + // ============================= common ============================ + + /** + * 指定缓存失效时间 + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key获取过期时间 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + */ + @SuppressWarnings("unchecked") + public boolean del(String... key) { + try { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); + } + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + // ============================ String ============================= + + /** + * 普通缓存获取 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + */ + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + */ + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 递增 + */ + public long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递减 + */ + public long decr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } + + // ================================ Map ================================= + + /** + * HashGet + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,并设置时间 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除hash表中的值 + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + /** + * hash递增 + */ + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } + + /** + * hash递减 + */ + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + + // ============================ set ============================= + + /** + * 根据key获取Set中的所有值 + */ + public Set sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + */ + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + */ + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 将set数据放入缓存 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) { + expire(key, time); + } + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 获取set缓存的长度 + */ + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 移除值为value的 + */ + public long setRemove(String key, Object... values) { + try { + return redisTemplate.opsForSet().remove(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + // =============================== list ================================= + + /** + * 获取list缓存的内容 + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取list缓存的长度 + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引获取list中的值 + */ + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 将list放入缓存 + */ + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + */ + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将list放入缓存 + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + */ + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + */ + public long lRemove(String key, long count, Object value) { + try { + return redisTemplate.opsForList().remove(key, count, value); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/xly/service/XlyErpService.java b/src/main/java/com/xly/service/XlyErpService.java index 54c383f..1cdf9d5 100644 --- a/src/main/java/com/xly/service/XlyErpService.java +++ b/src/main/java/com/xly/service/XlyErpService.java @@ -3,6 +3,7 @@ package com.xly.service; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; @@ -16,8 +17,10 @@ import com.xly.constant.ReturnTypeCode; import com.xly.entity.*; import com.xly.exception.sqlexception.SqlGenerateException; import com.xly.exception.sqlexception.SqlValidateException; -import com.xly.mapper.ToolMetaMapper; import com.xly.runner.AppStartupRunner; +import com.xly.thread.AiSqlErrorHistoryThread; +import com.xly.thread.AiUserAgentQuestionThread; +import com.xly.thread.MultiThreadPoolServer; import com.xly.tool.DynamicToolProvider; import com.xly.util.EnhancedErrorGuidance; import com.xly.util.InputPreprocessor; @@ -34,6 +37,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.util.IdGenerator; import java.time.Duration; import java.util.*; @@ -51,6 +55,7 @@ public class XlyErpService { private final DynamicToolProvider dynamicToolProvider; private final OperableChatMemoryProvider operableChatMemoryProvider; private final DynamicExeDbService dynamicExeDbService; + private final RedisService redisService; //执行动态语句 执行异常的情况下 最多执行次数 private final Integer maxRetries = 5; @@ -186,6 +191,18 @@ public class XlyErpService { while (attempt < maxRetries) { try{ attempt = attempt+1; + if(attempt==1){ + List userQuestionList = session.getSUserQuestionList(); + if(ObjectUtil.isEmpty(userQuestionList)){ + userQuestionList = new ArrayList<>(); + } + String sQuestion = StrUtil.replace(userInput," ",StrUtil.EMPTY); + sQuestion = StrUtil.replace(sQuestion,"\t",StrUtil.EMPTY); + sQuestion = StrUtil.replace(sQuestion,"\n",StrUtil.EMPTY); + sQuestion = sQuestion.toLowerCase(); + userQuestionList.add(sQuestion); + session.setSUserQuestionList(userQuestionList); + } return getDynamicTableSqlExec(session, input, userId, userInput,errorSql,errorMessage,iErroCount,historySqlList, aiAgent); }catch (SqlValidateException e){ return "本场景没有识别到您的意图
如果切换场景,点[回首页],如果在本场景下,转换意图,点[清除记忆]"; @@ -243,38 +260,63 @@ public class XlyErpService { **/ private String getDynamicTableSqlExec(UserSceneSession session,String input,String userId,String userInput,String errorSql,String errorMessage,String iErroCount,String historySqlList,ErpAiAgent aiAgent){ // 1. 构建自然语言转SQLAgent, - DynamicTableNl2SqlAiAgent aiDynamicTableNl2SqlAiAgent = createDynamicTableNl2SqlAiAgent(userId, input, session); - String tableNames = session.getCurrentTool().getSInputTabelName(); - // "订单表:viw_salsalesorder,客户信息表:elecustomer,结算方式表:sispayment,产品表(无单价,无金额,无数量):viw_product_sort,销售人员表:viw_sissalesman_depart"; - String tableStruct = session.getCurrentTool().getSStructureMemo(); - String sDataNow = DateUtil.format(new Date(), DatePattern.CHINESE_DATE_TIME_FORMAT); - String rawSql = StrUtil.EMPTY; - if(ObjectUtil.isEmpty(errorSql) && ObjectUtil.isEmpty(errorMessage)){ - rawSql = aiDynamicTableNl2SqlAiAgent.generateMysqlSql(userId,tableNames,tableStruct,sDataNow,userInput); - }else{ - rawSql = aiDynamicTableNl2SqlAiAgent.regenerateSqlWithError(userId, tableNames,tableStruct,sDataNow,userInput,errorSql,errorMessage,iErroCount,historySqlList); - } - log.info("rawSql:"+rawSql); - if (rawSql == null || rawSql.trim().isEmpty()) { - throw new SqlValidateException("SQL EMPTY"); - } - // 2. 清理SQL多余符号 + 生产级强校验(核心安全保障,不可省略) - String cleanSql = SqlValidateUtil.cleanSqlSymbol(rawSql); -// String[] cleanSqlA = rawSql.split(";"); -// if(cleanSqlA.length>1){ -// cleanSql = cleanSqlA[cleanSqlA.length-1]; -// } - SqlValidateUtil.validateMysqlSql(cleanSql); - // 4. 执行SQL获取结构化结果 -// Map params = new HashMap<>(); List> sqlResult = new ArrayList<>(); + String cleanSql = StrUtil.EMPTY; + String rawSql; + String tableStruct; + String sError_mes = StrUtil.EMPTY; + Boolean doSqlErro = false; + List chatMessage = operableChatMemoryProvider.getCurrentChatMessages(session.getUserId()); try{ - sqlResult = dynamicExeDbService.findSql(new HashMap<>(),cleanSql); - }catch (Exception e){ - throw new SqlGenerateException(e.getMessage()+" OLDSQL "+cleanSql); + DynamicTableNl2SqlAiAgent aiDynamicTableNl2SqlAiAgent = createDynamicTableNl2SqlAiAgent(userId, input, session); + String tableNames = session.getCurrentTool().getSInputTabelName(); + // "订单表:viw_salsalesorder,客户信息表:elecustomer,结算方式表:sispayment,产品表(无单价,无金额,无数量):viw_product_sort,销售人员表:viw_sissalesman_depart"; + tableStruct = session.getCurrentTool().getSStructureMemo(); + String sDataNow = DateUtil.format(new Date(), DatePattern.CHINESE_DATE_TIME_FORMAT); + + if(ObjectUtil.isEmpty(errorSql) && ObjectUtil.isEmpty(errorMessage)){ + rawSql = aiDynamicTableNl2SqlAiAgent.generateMysqlSql(userId,tableNames,tableStruct,sDataNow,userInput); + }else{ + rawSql = aiDynamicTableNl2SqlAiAgent.regenerateSqlWithError(userId, tableNames,tableStruct,sDataNow,userInput,errorSql,errorMessage,iErroCount,historySqlList); + } + log.info("rawSql:"+rawSql); + if (rawSql == null || rawSql.trim().isEmpty()) { + throw new SqlValidateException("SQL EMPTY"); + } + // 2. 清理SQL多余符号 + 生产级强校验(核心安全保障,不可省略) + cleanSql = SqlValidateUtil.cleanSqlSymbol(rawSql); + // String[] cleanSqlA = rawSql.split(";"); + // if(cleanSqlA.length>1){ + // cleanSql = cleanSqlA[cleanSqlA.length-1]; + // } + SqlValidateUtil.validateMysqlSql(cleanSql); + // 4. 执行SQL获取结构化结果 + // Map params = new HashMap<>(); + try{ + sqlResult = dynamicExeDbService.findSql(new HashMap<>(),cleanSql); + }catch (Exception e){ + throw new SqlGenerateException(e.getMessage()+" OLDSQL "+cleanSql); + } + }catch (SqlValidateException e){ + sError_mes = e.getMessage(); + doAiSqlErrorHistoryThread(session, StrUtil.EMPTY, cleanSql, sError_mes,input); + throw e; + }catch (SqlGenerateException e){ + sError_mes = e.getMessage(); + doAiSqlErrorHistoryThread(session, StrUtil.EMPTY, cleanSql, sError_mes,input); + throw e; } + // 5. 调用AI服务生成自然语言解释(传入表结构,让解释更贴合业务) String resultJson = JSON.toJSONString(sqlResult); + + //执行正确去修改对应正确的SQl + if(Integer.valueOf(iErroCount)>0){ + doAiSqlErrorHistoryThread(session, cleanSql, StrUtil.EMPTY, StrUtil.EMPTY,input); + } + + //执行操作记录表 + doAiUserAgentQuestion(session,input,cleanSql,chatMessage); String sText = aiAgent.explainSqlResult( userId, userInput, @@ -282,10 +324,49 @@ public class XlyErpService { tableStruct, resultJson ); - log.info("sText:"+sText); return sText; } + + /*** + * @Author 钱豹 + * @Date 16:57 2026/3/14 + * @Param + * @return + * @Description 记录动态SQL日志(多线程) + **/ + public void doAiSqlErrorHistoryThread(UserSceneSession session, + String sSqlContent, + String sError_sql, + String sError_mes, + String sQuestion + + ){ + MultiThreadPoolServer mts = MultiThreadPoolServer.getInstance(); + AiSqlErrorHistoryThread at = new AiSqlErrorHistoryThread(session, sSqlContent, sError_sql, sError_mes,sQuestion); + mts.service(at); + } + + /*** + * @Author 钱豹 + * @Date 16:57 2026/3/14 + * @Param + * @return + * @Description 记录动态SQL日志(多线程) + **/ + public void doAiUserAgentQuestion(UserSceneSession session, + String sQuestion, + String sSqlContent, + List chatMessage + + ){ + MultiThreadPoolServer mts = MultiThreadPoolServer.getInstance(); + AiUserAgentQuestionThread at = new AiUserAgentQuestionThread(session,sQuestion,sSqlContent,chatMessage); + mts.service(at); + } + + + /*** * @Author 钱豹 * @Date 11:22 2026/1/31 diff --git a/src/main/java/com/xly/thread/AiSqlErrorHistoryThread.java b/src/main/java/com/xly/thread/AiSqlErrorHistoryThread.java new file mode 100644 index 0000000..86b348f --- /dev/null +++ b/src/main/java/com/xly/thread/AiSqlErrorHistoryThread.java @@ -0,0 +1,65 @@ +package com.xly.thread; + + +import cn.hutool.core.util.StrUtil; +import com.xly.config.SpringContextHolder; +import com.xly.entity.UserSceneSession; +import com.xly.service.DynamicExeDbService; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class AiSqlErrorHistoryThread implements Runnable { + private UserSceneSession session; + private String sSqlContent; + private String sError_sql; + private String sError_mes; + private String sQuestion; + public final String sProName="Sp_Ai_AiSqlErrorHistoryThread"; + + public AiSqlErrorHistoryThread(UserSceneSession session, String sSqlContent, String sError_sql,String sError_mes,String sQuestion) { + this.session = session; + this.sSqlContent = sSqlContent; + this.sError_sql = sError_sql; + this.sError_mes = sError_mes; + this.sQuestion = sQuestion; + } + @Override + public void run() { + String sSceneId = session.getCurrentScene().getSId(); + String sMethodId = session.getCurrentTool().getSId(); + DynamicExeDbService dynamicExeDbService = SpringContextHolder.getBean(DynamicExeDbService.class); + Map data = getMap(sSceneId, sMethodId); + data.put("sQuestion",getsQuestion(session.getSUserQuestionList())); + Map searMap = dynamicExeDbService.getDoProMap(sProName, data); + dynamicExeDbService.getCallPro(searMap, sProName); + } + private String getsQuestion(List sUserQuestionList){ + return String.join(",", sUserQuestionList); + } + /*** + * @Author 钱豹 + * @Date 4:22 2026/3/15 + * @Param [sSceneId, sMethodId] + * @return java.util.Map + * @Description 获取执行的动态Map + **/ + private Map getMap(String sSceneId, String sMethodId) { + Map data = new HashMap<>(16); + data.put("sSceneId", sSceneId); + data.put("sMethodId", sMethodId); + data.put("sSqlContent",sSqlContent); + data.put("sError_sql",sError_sql); + data.put("sError_mes",sError_mes); + data.put("sBrId",session.getSBrandsId()); + data.put("sBrandsId",session.getSBrandsId()); + data.put("sSuId",session.getSSubsidiaryId()); + data.put("sSubsidiaryId",session.getSSubsidiaryId()); + data.put("sLoginId",session.getUserName()); + data.put("sUserName",session.getUserName()); + data.put("sUserId",session.getUserId()); + return data; + } +} diff --git a/src/main/java/com/xly/thread/AiUserAgentQuestionThread.java b/src/main/java/com/xly/thread/AiUserAgentQuestionThread.java new file mode 100644 index 0000000..9071995 --- /dev/null +++ b/src/main/java/com/xly/thread/AiUserAgentQuestionThread.java @@ -0,0 +1,90 @@ +package com.xly.thread; + + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.xly.config.OperableChatMemoryProvider; +import com.xly.config.SpringContextHolder; +import com.xly.entity.UserSceneSession; +import com.xly.service.DynamicExeDbService; +import dev.langchain4j.data.message.ChatMessage; +import dev.langchain4j.data.message.ChatMessageType; +import jnr.ffi.annotations.In; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class AiUserAgentQuestionThread implements Runnable { + private UserSceneSession session; + private String sSqlContent; + private String sQuestion; + List userMessage; + public final String sProName="Sp_Ai_AiUserAgentQuestionThread"; + + public AiUserAgentQuestionThread(UserSceneSession session,String sQuestion,String sSqlContent, List userMessage ) { + this.session = session; + this.sSqlContent = sSqlContent; + this.sQuestion = sQuestion; + this.userMessage = userMessage; + } + + @Override + public void run() { + sQuestion = sQuestion.replace("用户输入:",StrUtil.EMPTY); + String sSceneId = session.getCurrentScene().getSId(); + String sMethodId = session.getCurrentTool().getSId(); + DynamicExeDbService dynamicExeDbService = SpringContextHolder.getBean(DynamicExeDbService.class); + String sQuestionGroupNo = session.getSUserQuestionList().get(0); + Integer bRedis = (session.getSUserQuestionList().size()==1)?1:0; + Map data = getMap(sSceneId, sMethodId,bRedis,sQuestionGroupNo); + data.put("sQuestion",getsQuestion(session.getSUserQuestionList())); + Map searMap = dynamicExeDbService.getDoProMap(sProName, data); + dynamicExeDbService.getCallPro(searMap, sProName); + } + + private String getsQuestion(List sUserQuestionList){ + return String.join(",", sUserQuestionList); + } + + //获取组ID + private String getQuestionGroupNo(){ + String sQuestionGroupNo = userMessage.stream() + .filter(one -> one.type().equals(ChatMessageType.USER) && !"用户输入:initAiService".equals(one.text())) + .findFirst() + .map(one->one.text()) + .orElse(StrUtil.EMPTY); + sQuestionGroupNo = sQuestionGroupNo.replace("用户输入:",StrUtil.EMPTY); + sQuestionGroupNo = sQuestionGroupNo.replace(" ",StrUtil.EMPTY); + sQuestionGroupNo = sQuestionGroupNo.replace("\\t",StrUtil.EMPTY); + sQuestionGroupNo = sQuestionGroupNo.replace("\\n",StrUtil.EMPTY); + sQuestionGroupNo = sQuestionGroupNo.toLowerCase(); + return sQuestionGroupNo; + } + + + /*** + * @Author 钱豹 + * @Date 4:22 2026/3/15 + * @Param [sSceneId, sMethodId] + * @return java.util.Map + * @Description 获取执行的动态Map + **/ + private Map getMap(String sSceneId, String sMethodId,Integer bRedis,String sQuestionGroupNo) { + Map data = new HashMap<>(16); + data.put("sSceneId", sSceneId); + data.put("sMethodId", sMethodId); + data.put("sSqlContent",sSqlContent); + data.put("sBrId",session.getSBrandsId()); + data.put("sBrandsId",session.getSBrandsId()); + data.put("sSuId",session.getSSubsidiaryId()); + data.put("sSubsidiaryId",session.getSSubsidiaryId()); + data.put("sLoginId",session.getUserName()); + data.put("sUserName",session.getUserName()); + data.put("sUserId",session.getUserId()); + data.put("bRedis",bRedis); + data.put("sQuestionGroupNo",sQuestionGroupNo); + return data; + } +} diff --git a/src/main/java/com/xly/thread/MultiThreadPoolServer.java b/src/main/java/com/xly/thread/MultiThreadPoolServer.java new file mode 100644 index 0000000..bcfb49d --- /dev/null +++ b/src/main/java/com/xly/thread/MultiThreadPoolServer.java @@ -0,0 +1,103 @@ +package com.xly.thread; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import org.apache.poi.ss.formula.functions.T; +import org.python.google.common.util.concurrent.ThreadFactoryBuilder; + + +/** + * + * 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式, + * 这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 + * 说明:Executors各个方法的弊端: + * 1)newFixedThreadPool和newSingleThreadExecutor: + *   主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。 + * 2)newCachedThreadPool和newScheduledThreadPool: + *   主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。 + * 功能:任务线程池类(2秒更新一次线程单独用) + * 工具类参考https://blog.csdn.net/bunnycoffer/article/details/82908024 + * 作者:qb + * 日期:2018-11-13 + * @author qianbao + */ +public class MultiThreadPoolServer { + + /** ˽������线程池服务*/ + private ExecutorService executorService; + private static MultiThreadPoolServer mts; + private final static int poolSize = 30000; + private final static int queueSize = 30000; + + private static ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("theadpool" + "-%d").setDaemon(true).build(); + /** 单例方法 */ + public static MultiThreadPoolServer getInstance() { + + //生成实例 + if (mts == null) { + //锁类ͬ���� + synchronized(MultiThreadPoolServer.class) { + if (mts == null) { + //实例化 + mts = new MultiThreadPoolServer(); + mts.executorService = new ThreadPoolExecutor(poolSize, + poolSize, + 0L, + TimeUnit.SECONDS, + new ArrayBlockingQueue(queueSize), + threadFactory, + new ThreadPoolExecutor.AbortPolicy() { + // 队列已满,而且当前线程数已经超过最大线程数时的异常处理策略 + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { + super.rejectedExecution(r, e); + } + }); + } + } + } + + //返回值 + return mts; + + } + + /** 线程池调用方法 */ + public void service(Runnable handler) { + try { + //调用线程 + this.executorService.execute(handler); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 开启一个有返回结果的线程 + * @param + * @return + */ + public Future submit(Callable handler) { + // 把一个任务丢到了线程池中 + try { + //调用线程 + return this.executorService.submit(handler); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + /** 线程池结束 */ + public void shutdown() { + this.executorService.shutdown(); + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4cc4d26..27ee7ab 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -50,23 +50,18 @@ spring: idle-timeout: 600000 max-lifetime: 1800000 # REDIS (RedisProperties) -# redis: -# host: 127.0.0.1 -# password: xlyXLY2015 -# port: 6380 -# database: 8 # index -# timeout: 30000ms # 连接超时时长(毫秒) -# block-when-exhausted: true #redis配置结束 -# lettuce: -# pool: -# # 连接池中的最大空闲连接 -# max-idle: 20 -# # 连接池中的最小空闲连接 -# min-idle: 20 -# # 连接池最大连接数(使用负值表示没有限制) -# max-active: 200 -# # 连接池最大阻塞等待时间(使用负值表示没有限制) -# max-wait: -1 + data: + redis: + host: localhost + port: 6379 # Redis 端口 + database: 0 # 使用的数据库索引(默认为0) + password: # 密码(如果没有设置则为空) + timeout: 3000ms # 连接超时时间 + lettuce: + pool: + max-active: 8 # 连接池最大连接数 + max-idle: 8 # 连接池最大空闲连接 + min-idle: 0 # 连接池最小空闲连接 # application.yml 或 application.properties langchain4j: -- libgit2 0.22.2