# jf2util4idea
**Repository Path**: youfule/jf2util4idea
## Basic Information
- **Project Name**: jf2util4idea
- **Description**: 日常使用中积累的java工具包已经工具方法集合
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-11-12
- **Last Updated**: 2024-11-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# javautils
#### 介绍
日常使用所沉淀积累基础组件和工具
#### 软件架构
目前提供一部分基础工具组件,后续添加更多的组件将涵盖多个领域
##### cache模块
- 基于配置支持单机、哨兵、分片、集群模式自由切换
- 更加简单的操作API封装
- 一级缓存支持(ehcache & guava cache)、分布式场景多节点自动通知
- 多组缓存配置同时支持 (一个应用多个redis server)
- 分布式模式开关
##### common模块
- 一些常用工具类
- common模块提供基础工具类,依赖common-lang3。
##### common2模块(需要依赖一些组件或者基础设置)
- 分布式锁
- 分布式全局ID生成器
- excel导入导出
##### filesystem
- 文件系统服务目前支持七牛和fastDFS集成,提供了工厂模式和spring注入两种集成方式。
##### kafka
- 基于spring封装简化配置和调用方式
- 基于配置新旧两版Consumer API兼容支持
- 支持二阶段处理,即:fetch线程同步处理和process线程异步处理
- 消费成功业务处理失败自动重试或自定义重试支持
- process线程池采用LinkedTransferQueue,支持线程回收和队列大小限制,确保系统崩溃等不会有数据丢失。
##### mybatis
- 代码生成、自动CRUD、可无缝对接mybaits增强框架Mapper
- 基于properties配置多数据源支持,无需修改XML
- 读写分离,事务内操作强制读主库
- 基于注解自动缓存管理(所有查询方法结果自动缓存、自动更新,事务回滚缓存同步回滚机制)
- 自动缓存实现基于jeesuite-cache和spring-data-redis
- 分页组件
- 敏感操作拦截
##### rest
- 自动resonse封装(xml、json)
- i18n
- request、response日志记录
- 自动友好错误
- 校验框架
##### scheduler
- 支持分布式保证单节点执行(按节点平均分配job)
- 支持failvoer,自动切换故障节点
- 支持多节点下并行计算
- 支持无注册中心单机模式
- 支持自定义重试策略
- 支持配置持久化(启动加载、变更保存)
- 支持控制台(jeesuite-admin)任务监控、开停、动态修改调度时间策略、手动触发执行
#### 使用说明
##### common
- JsonUtils:Json字符串与对象转化,基于jackson封装。
- 序列化工具:FSTSerializer,JavaSerializer,KryoSerializer,KryoPoolSerializer
- PackageScanner:包扫描
- BeanCopyUtils:bean之间值复制工具类,比BeanUtils效率高
- DateUtils:常用日期函数,与common-lang包日期函数互补
- FormatValidateUtils:常用格式校验工具
- HashUtils:MurMurHash算法实现的hash算法
- JDBCUtils:jdbc工具
- ReflectUtils:反射工具
- ResourceUtils:属性读取工具
- NodeNameHolder:全局节点名称
##### cache
- RedisString
- RedisObject
- RedisList
- RedisStrList
- RedisNumber
- RedisSet
- RedisStrSet
- RedisSortSet
- RedisStrSortSet
- RedisHashMap
- RedisStrHashMap
```java
//字符串
RedisString redisString = new RedisString("User.id:1001");
redisString.set("user1001", 60);
String value = redisString.get();
redisString.getTtl();
redisString.exists();
redisString.setExpire(300);
redisString.remove();
//对象
RedisObject redisObject = new RedisObject("User.id:1001");
redisObject.set(new User(1001, "jack"));
Object user = redisObject.get();
redisObject.getTtl();
redisObject.exists();
redisObject.setExpire(300);
redisObject.remove();
//hash
RedisHashMap redisHashMap = new RedisHashMap("User.all");
redisHashMap.set("1001", new User(1001, "jack"));
redisHashMap.set("1002", new User(1002, "jack2"));
Map < String,
User > users = redisHashMap.get("1001", "1002");
users = redisHashMap.getAll();
User one = redisHashMap.getOne("1001");
redisHashMap.containsKey("1001");
redisHashMap.remove();
//指定缓存服务组名
//new RedisObject(key, groupName)
new RedisObject("User.id:1001", "session_cache");
```
##### common2
- 全局Id生成器
目前只实现基于Snowflake算法生成器,后续新增基于数据库sequence的。
```java
SnowflakeGenerator generator = new SnowflakeGenerator("127.0.0.1:2181");
long id = generator.nextId();
System.out.println(id);
```
- 分布式锁
```java
//redis
public void run() {
RedisDistributeLock lock = new RedisDistributeLock("test");
//boolean getLock = lock.tryLock(5, TimeUnit.SECONDS);
lock.lock();
System.out.println("LockWorker[" + id + "] get lock,doing");
try {
Thread.sleep(RandomUtils.nextLong(1000, 10000));
} catch(Exception e) {}
lock.unlock();
latch.countDown();
System.out.println("LockWorker[" + id + "] release lock,done");
}
//zookeeper
@Override public void run() {
ZkDistributeLock lock = new ZkDistributeLock("127.0.0.1:2181", "test");
lock.lock();
System.out.println("LockWorker[" + id + "] get lock,doing");
try {
Thread.sleep(2000);
} catch(Exception e) {}
lock.unlock();
latch.countDown();
System.out.println("LockWorker[" + id + "] release lock,done");
}
```
##### filesystem
- 工厂模式
配置文件,xx.properties
```
fs.groupNames=group1,group2
# 服务提供者可选值(fastDFS,qiniu)
fs.group1.provider=qiniu
fs.group1.accessKey=iqq3aa-ncqfdGGubCcS-N8EUV-qale2ezndnrtKS
fs.group1.secretKey=1RmdaMVjrjXkyRVPOmyMa6BzcdG5VDdF-SH_HUTe
fs.group1.urlprefix=http://7xq7jj.com1.z0.glb.clouddn.com
# group2 配置
fs.group2.provider=fastDFS
fs.group2.servers=192.168.1.101:22122,192.168.1.102:22122
.....
fs.group2.connectTimeout=3000
fs.group2.maxThreads=100
......
```
参数说明:
- groupNames:多个组用“,”隔开,对应七牛的`bucketName`
用法
```
FSProvider provider = FSClientFactory.build("qiniu", "group1");
String url = provider.upload("test", null, new File("/Users/vakinge/logo.gif"));
```
- spring方式
```
```
用法
```
@Autowired
FSProviderSpringFacade provider;
String url = provider.upload("test", null, new File("/Users/vakinge/logo.gif"));
```
##### kafka
- 添加依赖
```xml
com.jeesuite
jeesuite-kafka
1.1.0
```
##### mybatis
- 添加依赖
```xml
com.jeesuite
jeesuite-mybatis
最新版本
```
- 已实现方法
```
getByKey
insert
insertSelective
updateByKey
updateByKeySelective
deleteByKey
selectAll
```
##### scheduler
- 添加依赖
```xml
com.jeesuite
jeesuite-scheduler
1.1.0
```
- 全局参数说明:
```
groupName 任务组,要确保和其他项目唯一 (必填)
registry 注册中心,不配置则为单机模式 (选填)
configPersistHandler 持久化配置支持,启动时合并配置和更新配置。(选填)
```
- job参数说明:
```
jobName 任务名,确保同一groupName下唯一
retries 重试次数,默认不重试
cronExpr 执行时间策略,如果配置了configPersistHandler以merge后的为准。
```