diff --git a/CHANGELOG.md b/CHANGELOG.md index e1ece72c..61628d28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ RxCache === +Version 2.1.8 +--- +2023-2-14 +* 第三方库的升级 +* 增加对外暴露的日志接口 + Version 2.1.7 --- 2023-1-16 diff --git a/build.gradle b/build.gradle index f00a30fc..d412cee9 100644 --- a/build.gradle +++ b/build.gradle @@ -24,23 +24,23 @@ ext { caffeine : "2.9.2", - okio : "2.10.0", + okio : "3.3.0", mapdb : "3.0.8", - moshi : "1.12.0", + moshi : "1.14.0", protostuff : "1.7.4", ktor : "1.6.4", - chronicle_map : "3.23ea1", + chronicle_map : "3.24ea2", bytekit : "v1.3.0", result : "v1.0.4", - coroutines_utils : "v1.1.5" + coroutines_utils : "v1.1.6" ] } diff --git a/converter/protobuf/src/main/java/com/safframework/rxcache/converter/ProtostuffUtils.java b/converter/protobuf/src/main/java/com/safframework/rxcache/converter/ProtostuffUtils.java index a55feccf..8be6f114 100644 --- a/converter/protobuf/src/main/java/com/safframework/rxcache/converter/ProtostuffUtils.java +++ b/converter/protobuf/src/main/java/com/safframework/rxcache/converter/ProtostuffUtils.java @@ -2,6 +2,7 @@ import com.safframework.rxcache.domain.CacheHolder; import com.safframework.rxcache.exception.RxCacheException; +import com.safframework.rxcache.log.LoggerProxy; import io.protostuff.*; import io.protostuff.runtime.DefaultIdStrategy; import io.protostuff.runtime.Delegate; @@ -111,6 +112,7 @@ private static Schema getSchema(Class cls) { public static byte[] serialize(T obj) { if (obj == null) { + LoggerProxy.INSTANCE.getLogger().i("序列号对象不能为空","rxcache"); throw new RxCacheException("序列号对象不能为空"); } @@ -126,6 +128,7 @@ public static byte[] serialize(T obj) { } return ProtostuffIOUtil.toByteArray(serializeObject, schema, buffer); } catch (Exception e) { + LoggerProxy.INSTANCE.getLogger().e("serialize is failed...","rxcache", e); throw new IllegalStateException(e.getMessage(), e); } finally { buffer.clear(); @@ -143,6 +146,7 @@ public static byte[] serialize(T obj) { public static T deserialize(byte[] data, Class clazz) { if (data == null) { + LoggerProxy.INSTANCE.getLogger().i("反序列号对象不能为空","rxcache"); throw new RxCacheException("反序列号对象不能为空"); } @@ -158,6 +162,7 @@ public static T deserialize(byte[] data, Class clazz) { return wrapper.getData(); } } catch (Exception e) { + LoggerProxy.INSTANCE.getLogger().e("deserialize is failed...","rxcache", e); throw new IllegalStateException(e.getMessage(), e); } } diff --git a/core/build.gradle b/core/build.gradle index 72913920..fdfa4b1c 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'kotlin' } group = 'com.github.fengzhizi715' @@ -15,8 +16,19 @@ repositories { dependencies { testImplementation group: 'junit', name: 'junit', version: '4.12' - + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "com.google.code.gson:gson:${libs.gson}" implementation "com.github.fengzhizi715.bytekit:core:${libs.bytekit}" implementation "org.jooq:joor-java-8:${libs.joor_java}" + +} +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } } diff --git a/core/src/main/java/com/safframework/rxcache/CacheRepository.java b/core/src/main/java/com/safframework/rxcache/CacheRepository.java index 6c77708b..6fc55758 100644 --- a/core/src/main/java/com/safframework/rxcache/CacheRepository.java +++ b/core/src/main/java/com/safframework/rxcache/CacheRepository.java @@ -6,6 +6,8 @@ import com.safframework.rxcache.domain.CacheStrategy; import com.safframework.rxcache.domain.Record; import com.safframework.rxcache.key.KeyEviction; +import com.safframework.rxcache.log.Logger; +import com.safframework.rxcache.log.LoggerProxy; import com.safframework.rxcache.memory.Memory; import com.safframework.rxcache.persistence.Persistence; import com.safframework.rxcache.persistence.converter.Converter; @@ -317,7 +319,7 @@ protected boolean checkKey(String key) { try { return getStringData(key)!=null; } catch (Exception e){ - e.printStackTrace(); + LoggerProxy.INSTANCE.getLogger().e("checkKey() is failed...", "rxcache", e); return false; } } diff --git a/core/src/main/java/com/safframework/rxcache/RxCache.java b/core/src/main/java/com/safframework/rxcache/RxCache.java index bf4ebd7d..3f78f92d 100644 --- a/core/src/main/java/com/safframework/rxcache/RxCache.java +++ b/core/src/main/java/com/safframework/rxcache/RxCache.java @@ -4,6 +4,8 @@ import com.safframework.rxcache.domain.CacheStrategy; import com.safframework.rxcache.domain.Record; import com.safframework.rxcache.key.KeyEviction; +import com.safframework.rxcache.log.Logger; +import com.safframework.rxcache.log.LoggerProxy; import com.safframework.rxcache.memory.Memory; import com.safframework.rxcache.memory.impl.FIFOMemoryImpl; import com.safframework.rxcache.persistence.Persistence; @@ -59,6 +61,8 @@ private RxCache(Builder builder) { cacheRepository = new CacheRepository(builder.memory, builder.persistence, builder.keyEviction); adapter = builder.adapter; + LoggerProxy.INSTANCE.initLogger(builder.log); + if (builder.keyEviction == KeyEviction.ASYNC && adapter!=null) { adapter.interval(this); } @@ -379,6 +383,7 @@ public void dispose() { public static final class Builder { private Memory memory; private Persistence persistence; + private Logger log; private KeyEviction keyEviction; private Adapter adapter; @@ -392,6 +397,11 @@ public Builder persistence(Persistence persistence) { return this; } + public Builder log(Logger logger) { + this.log = logger; + return this; + } + public Builder keyEviction(KeyEviction keyEviction) { this.keyEviction = keyEviction; return this; @@ -411,6 +421,37 @@ public RxCache build() { keyEviction = KeyEviction.SYNC; // 默认情况,使用同步删除淘汰 key 的方式 } + if (log == null) { // 默认情况,设置 Logger + log = new Logger() { + @Override + public void i(String msg, String tag) { + System.out.println(tag + " " + msg); + } + + @Override + public void v(String msg, String tag) { + System.out.println(tag + " " + msg); + } + + @Override + public void d(String msg, String tag) { + System.out.println(tag + " " + msg); + } + + @Override + public void w(String msg, String tag, Throwable tr) { + tr.printStackTrace(); + System.out.println(tag + " " + msg); + } + + @Override + public void e(String msg, String tag, Throwable tr) { + tr.printStackTrace(); + System.err.println(tag + " " + msg); + } + }; + } + return new RxCache(this); } } diff --git a/core/src/main/java/com/safframework/rxcache/key/KeyEviction.java b/core/src/main/java/com/safframework/rxcache/key/KeyEviction.java index 267274b7..3926911c 100644 --- a/core/src/main/java/com/safframework/rxcache/key/KeyEviction.java +++ b/core/src/main/java/com/safframework/rxcache/key/KeyEviction.java @@ -4,9 +4,9 @@ * @FileName: com.safframework.rxcache.key.KeyEviction * @author: Tony Shen * @date: 2021-02-09 21:14 - * @version: V1.0 <描述当前版本功能> + * @version: V1.0 key 淘汰的枚举,包含同步淘汰 key 和 异步淘汰 key */ public enum KeyEviction { - SYNC, - ASYNC + SYNC, // 默认为 同步淘汰 key的方式,在获取缓存 key 的同时,会判断是否过期 + ASYNC // 异步淘汰 key 的方式: RxCache 内部定时判断所有的 key ,如果有过期的 key,则删除 } diff --git a/core/src/main/java/com/safframework/rxcache/memory/algorithm/lru/LRUCache.java b/core/src/main/java/com/safframework/rxcache/memory/algorithm/lru/LRUCache.java index ffbe77c2..4febae3e 100644 --- a/core/src/main/java/com/safframework/rxcache/memory/algorithm/lru/LRUCache.java +++ b/core/src/main/java/com/safframework/rxcache/memory/algorithm/lru/LRUCache.java @@ -2,6 +2,7 @@ import com.safframework.rxcache.domain.CacheStatistics; import com.safframework.rxcache.exception.RxCacheException; +import com.safframework.rxcache.log.LoggerProxy; import java.util.AbstractQueue; import java.util.Iterator; @@ -55,7 +56,10 @@ public V getSilent(K key) { public void put(K key, V value) { - if(key == null || value == null) throw new RxCacheException("key is null or value is null"); + if(key == null || value == null) { + LoggerProxy.INSTANCE.getLogger().i("key is null or value is null","rxcache"); + throw new RxCacheException("key is null or value is null"); + } if(cache.containsKey(key)) { queue.remove(key); diff --git a/core/src/main/java/com/safframework/rxcache/persistence/disk/impl/DiskImpl.java b/core/src/main/java/com/safframework/rxcache/persistence/disk/impl/DiskImpl.java index a396fb68..5e1f405b 100644 --- a/core/src/main/java/com/safframework/rxcache/persistence/disk/impl/DiskImpl.java +++ b/core/src/main/java/com/safframework/rxcache/persistence/disk/impl/DiskImpl.java @@ -7,6 +7,7 @@ import com.safframework.rxcache.domain.Record; import com.safframework.rxcache.domain.Source; import com.safframework.rxcache.exception.RxCacheException; +import com.safframework.rxcache.log.LoggerProxy; import com.safframework.rxcache.persistence.converter.Converter; import com.safframework.rxcache.persistence.converter.GsonConverter; import com.safframework.rxcache.persistence.disk.Disk; @@ -97,7 +98,7 @@ public Record retrieve(String key, Type type) { return result != null ? new Record<>(Source.PERSISTENCE, safetyKey, result, timestamp, expireTime) : null; } catch (Exception ignore) { - + LoggerProxy.INSTANCE.getLogger().e("retrieve() is failed...","rxcache", ignore); throw new RxCacheException(ignore); } finally { @@ -143,7 +144,7 @@ public String getStringData(String key) { return json; } catch (Exception ignore) { - + LoggerProxy.INSTANCE.getLogger().e("getStringData() is failed...","rxcache", ignore); throw new RxCacheException(ignore); } finally { @@ -169,6 +170,7 @@ public void save(String key, T value, long expireTime) { outputStream = new FileOutputStream(file, false); converter.writer(outputStream,new CacheHolder(converter.toJson(value),System.currentTimeMillis(),expireTime,converter.converterName())); } catch (Exception e) { + LoggerProxy.INSTANCE.getLogger().e("save() is failed...","rxcache", e); throw new RxCacheException(e); } finally { IOUtils.closeQuietly(outputStream); diff --git a/core/src/main/java/com/safframework/rxcache/reflect/TypeBuilder.java b/core/src/main/java/com/safframework/rxcache/reflect/TypeBuilder.java index f9d5275b..0595ecf6 100644 --- a/core/src/main/java/com/safframework/rxcache/reflect/TypeBuilder.java +++ b/core/src/main/java/com/safframework/rxcache/reflect/TypeBuilder.java @@ -1,6 +1,7 @@ package com.safframework.rxcache.reflect; import com.safframework.rxcache.exception.RxCacheException; +import com.safframework.rxcache.log.LoggerProxy; import com.safframework.rxcache.reflect.impl.ParameterizedTypeImpl; import com.safframework.rxcache.reflect.impl.WildcardTypeImpl; @@ -38,6 +39,7 @@ public TypeBuilder beginSubType(Class raw) { public TypeBuilder endSubType() { if (parent == null) { + LoggerProxy.INSTANCE.getLogger().i("expect beginSubType() before endSubType()", "rxcache"); throw new RxCacheException("expect beginSubType() before endSubType()"); } @@ -53,6 +55,7 @@ public TypeBuilder addTypeParam(Class clazz) { public TypeBuilder addTypeParamExtends(Class... classes) { if (classes == null) { + LoggerProxy.INSTANCE.getLogger().i("addTypeParamExtends() expect not null Class", "rxcache"); throw new RxCacheException("addTypeParamExtends() expect not null Class"); } @@ -64,6 +67,7 @@ public TypeBuilder addTypeParamExtends(Class... classes) { public TypeBuilder addTypeParamSuper(Class... classes) { if (classes == null) { + LoggerProxy.INSTANCE.getLogger().i("addTypeParamSuper() expect not null Class", "rxcache"); throw new RxCacheException("addTypeParamSuper() expect not null Class"); } @@ -75,6 +79,7 @@ public TypeBuilder addTypeParamSuper(Class... classes) { public TypeBuilder addTypeParam(Type type) { if (type == null) { + LoggerProxy.INSTANCE.getLogger().i("addTypeParam expect not null Type", "rxcache"); throw new RxCacheException("addTypeParam expect not null Type"); } @@ -86,6 +91,7 @@ public TypeBuilder addTypeParam(Type type) { public Type build() { if (parent != null) { + LoggerProxy.INSTANCE.getLogger().i("expect endSubType() before build()", "rxcache"); throw new RxCacheException("expect endSubType() before build()"); } diff --git a/core/src/main/java/com/safframework/rxcache/reflect/TypeToken.java b/core/src/main/java/com/safframework/rxcache/reflect/TypeToken.java index 91b5ffc8..1ec536d2 100644 --- a/core/src/main/java/com/safframework/rxcache/reflect/TypeToken.java +++ b/core/src/main/java/com/safframework/rxcache/reflect/TypeToken.java @@ -1,6 +1,7 @@ package com.safframework.rxcache.reflect; import com.safframework.rxcache.exception.RxCacheException; +import com.safframework.rxcache.log.LoggerProxy; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -16,6 +17,7 @@ public TypeToken() { Type superclass = getClass().getGenericSuperclass(); if (superclass instanceof Class) { + LoggerProxy.INSTANCE.getLogger().i("No generics found!", "rxcache"); throw new RxCacheException("No generics found!"); } ParameterizedType type = (ParameterizedType) superclass; diff --git a/core/src/main/java/com/safframework/rxcache/reflect/impl/ParameterizedTypeImpl.java b/core/src/main/java/com/safframework/rxcache/reflect/impl/ParameterizedTypeImpl.java index d1748c45..c9e2083b 100644 --- a/core/src/main/java/com/safframework/rxcache/reflect/impl/ParameterizedTypeImpl.java +++ b/core/src/main/java/com/safframework/rxcache/reflect/impl/ParameterizedTypeImpl.java @@ -1,6 +1,7 @@ package com.safframework.rxcache.reflect.impl; import com.safframework.rxcache.exception.RxCacheException; +import com.safframework.rxcache.log.LoggerProxy; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -27,12 +28,15 @@ public ParameterizedTypeImpl(Class raw, Type[] args, Type owner) { private void checkArgs() { if (raw == null) { + LoggerProxy.INSTANCE.getLogger().i("raw class can't be null", "rxcache"); throw new RxCacheException("raw class can't be null"); } TypeVariable[] typeParameters = raw.getTypeParameters(); if (args.length != 0 && typeParameters.length != args.length) { - throw new RxCacheException(raw.getName() + " expect " + typeParameters.length + " arg(s), got " + args.length); + String errorMsg = raw.getName() + " expect " + typeParameters.length + " arg(s), got " + args.length; + LoggerProxy.INSTANCE.getLogger().i(errorMsg, "rxcache"); + throw new RxCacheException(errorMsg); } } diff --git a/core/src/main/kotlin/com/safframework/rxcache/log/LoggerProxy.kt b/core/src/main/kotlin/com/safframework/rxcache/log/LoggerProxy.kt new file mode 100644 index 00000000..0575fe2b --- /dev/null +++ b/core/src/main/kotlin/com/safframework/rxcache/log/LoggerProxy.kt @@ -0,0 +1,32 @@ +package com.safframework.rxcache.log + +/** + * + * @FileName: + * com.safframework.rxcache.log.LoggerProxy + * @author: Tony Shen + * @date: 2023/2/13 8:00 PM + * @version: V1.0 <描述当前版本功能> + */ +interface Logger { + fun i(msg: String, tag: String? = "rxcache") + fun v(msg: String, tag: String? = "rxcache") + fun d(msg: String, tag: String? = "rxcache") + fun w(msg: String, tag: String? = "rxcache", tr: Throwable?) + fun e(msg: String, tag: String? = "rxcache", tr: Throwable?) +} + +object LoggerProxy { + + private lateinit var mLogger: Logger + + fun initLogger(logger: Logger) { + mLogger = logger + } + + fun getLogger() = mLogger +} + +fun String.logI() = LoggerProxy.getLogger().i(this,"rxcache") + +fun Throwable.logE(msg: String) = LoggerProxy.getLogger().e(msg, "rxcache", this) \ No newline at end of file diff --git a/example/src/main/kotlin/extension/TestCoroutines.kt b/example/src/main/kotlin/extension/TestCoroutines.kt index 310490b3..0c2c8f5c 100644 --- a/example/src/main/kotlin/extension/TestCoroutines.kt +++ b/example/src/main/kotlin/extension/TestCoroutines.kt @@ -6,7 +6,6 @@ import com.safframework.rxcache.coroutines.getDeferred import com.safframework.rxcache.coroutines.getFlow import com.safframework.rxcache.ext.saveFunc import domain.User -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking diff --git a/persistence/okio/src/main/java/com/safframework/rxcache/persistence/okio/OkioImpl.java b/persistence/okio/src/main/java/com/safframework/rxcache/persistence/okio/OkioImpl.java index 4b3f6708..15cf12ca 100644 --- a/persistence/okio/src/main/java/com/safframework/rxcache/persistence/okio/OkioImpl.java +++ b/persistence/okio/src/main/java/com/safframework/rxcache/persistence/okio/OkioImpl.java @@ -7,6 +7,7 @@ import com.safframework.rxcache.domain.Record; import com.safframework.rxcache.domain.Source; import com.safframework.rxcache.exception.RxCacheException; +import com.safframework.rxcache.log.LoggerProxy; import com.safframework.rxcache.persistence.converter.Converter; import com.safframework.rxcache.persistence.converter.GsonConverter; import com.safframework.rxcache.persistence.disk.Disk; @@ -116,7 +117,7 @@ public Record retrieve(String key, Type type) { return result != null ? new Record<>(Source.PERSISTENCE, safetyKey, result, timestamp, expireTime) : null; } catch (Exception ignore) { - + LoggerProxy.INSTANCE.getLogger().e("retrieve() is failed...", "rxcache", ignore); throw new RxCacheException(ignore); } finally { @@ -166,7 +167,7 @@ public String getStringData(String key) { return json; } catch (Exception ignore) { - + LoggerProxy.INSTANCE.getLogger().e("getStringData() is failed...", "rxcache", ignore); throw new RxCacheException(ignore); } finally {