From ace29bd74b88c725ab5c3515ce7a12151e84aa53 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 15:12:28 +0300 Subject: [PATCH 01/21] [maven-release-plugin] prepare release redisson-2.15.0 --- pom.xml | 4 ++-- redisson-all/pom.xml | 4 ++-- redisson-hibernate/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-4/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-5/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-52/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-53/pom.xml | 2 +- redisson-spring-boot-starter/pom.xml | 2 +- redisson-spring-data/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-16/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-17/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-18/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-20/pom.xml | 2 +- redisson-tomcat/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-6/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-7/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-8/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-9/pom.xml | 2 +- redisson/pom.xml | 2 +- 19 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index 9baa3f1a2..f61d2046a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.redisson redisson-parent - 2.14.2-SNAPSHOT + 2.15.0 pom Redisson @@ -28,7 +28,7 @@ scm:git:git@github.com:redisson/redisson.git scm:git:git@github.com:redisson/redisson.git scm:git:git@github.com:redisson/redisson.git - HEAD + redisson-2.15.0 diff --git a/redisson-all/pom.xml b/redisson-all/pom.xml index ada6e3ceb..e0b6b0c92 100644 --- a/redisson-all/pom.xml +++ b/redisson-all/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.14.2-SNAPSHOT + 2.15.0 ../ @@ -26,7 +26,7 @@ scm:git:git@github.com:mrniko/redisson.git scm:git:git@github.com:mrniko/redisson.git scm:git:git@github.com:mrniko/redisson.git - redisson-parent-0.9.0 + redisson-2.15.0 diff --git a/redisson-hibernate/pom.xml b/redisson-hibernate/pom.xml index d21e259b3..ba4c5eba2 100644 --- a/redisson-hibernate/pom.xml +++ b/redisson-hibernate/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-hibernate/redisson-hibernate-4/pom.xml b/redisson-hibernate/redisson-hibernate-4/pom.xml index 55225daeb..fc346e283 100644 --- a/redisson-hibernate/redisson-hibernate-4/pom.xml +++ b/redisson-hibernate/redisson-hibernate-4/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-hibernate/redisson-hibernate-5/pom.xml b/redisson-hibernate/redisson-hibernate-5/pom.xml index 086375393..319573d6f 100644 --- a/redisson-hibernate/redisson-hibernate-5/pom.xml +++ b/redisson-hibernate/redisson-hibernate-5/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-hibernate/redisson-hibernate-52/pom.xml b/redisson-hibernate/redisson-hibernate-52/pom.xml index 56ef064db..b1796bf07 100644 --- a/redisson-hibernate/redisson-hibernate-52/pom.xml +++ b/redisson-hibernate/redisson-hibernate-52/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-hibernate/redisson-hibernate-53/pom.xml b/redisson-hibernate/redisson-hibernate-53/pom.xml index 7df97cea5..6427d5bd1 100644 --- a/redisson-hibernate/redisson-hibernate-53/pom.xml +++ b/redisson-hibernate/redisson-hibernate-53/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-spring-boot-starter/pom.xml b/redisson-spring-boot-starter/pom.xml index 1c7a2fc51..22943b724 100644 --- a/redisson-spring-boot-starter/pom.xml +++ b/redisson-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-spring-data/pom.xml b/redisson-spring-data/pom.xml index 489306a3d..d26891a0c 100644 --- a/redisson-spring-data/pom.xml +++ b/redisson-spring-data/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-spring-data/redisson-spring-data-16/pom.xml b/redisson-spring-data/redisson-spring-data-16/pom.xml index 1ba9665d5..5f2c76b14 100644 --- a/redisson-spring-data/redisson-spring-data-16/pom.xml +++ b/redisson-spring-data/redisson-spring-data-16/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-spring-data/redisson-spring-data-17/pom.xml b/redisson-spring-data/redisson-spring-data-17/pom.xml index 1b1cac6eb..09c366c7e 100644 --- a/redisson-spring-data/redisson-spring-data-17/pom.xml +++ b/redisson-spring-data/redisson-spring-data-17/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-spring-data/redisson-spring-data-18/pom.xml b/redisson-spring-data/redisson-spring-data-18/pom.xml index e937e7a69..43c66d46a 100644 --- a/redisson-spring-data/redisson-spring-data-18/pom.xml +++ b/redisson-spring-data/redisson-spring-data-18/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-spring-data/redisson-spring-data-20/pom.xml b/redisson-spring-data/redisson-spring-data-20/pom.xml index 25cff982a..6485c6972 100644 --- a/redisson-spring-data/redisson-spring-data-20/pom.xml +++ b/redisson-spring-data/redisson-spring-data-20/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-tomcat/pom.xml b/redisson-tomcat/pom.xml index d90c343ac..df0b3ab73 100644 --- a/redisson-tomcat/pom.xml +++ b/redisson-tomcat/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-tomcat/redisson-tomcat-6/pom.xml b/redisson-tomcat/redisson-tomcat-6/pom.xml index 75ca6b2d1..362a07461 100644 --- a/redisson-tomcat/redisson-tomcat-6/pom.xml +++ b/redisson-tomcat/redisson-tomcat-6/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-tomcat/redisson-tomcat-7/pom.xml b/redisson-tomcat/redisson-tomcat-7/pom.xml index 0a83efab7..dbcc3a1e8 100644 --- a/redisson-tomcat/redisson-tomcat-7/pom.xml +++ b/redisson-tomcat/redisson-tomcat-7/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-tomcat/redisson-tomcat-8/pom.xml b/redisson-tomcat/redisson-tomcat-8/pom.xml index 16d49b04e..aa0aff5ef 100644 --- a/redisson-tomcat/redisson-tomcat-8/pom.xml +++ b/redisson-tomcat/redisson-tomcat-8/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson-tomcat/redisson-tomcat-9/pom.xml b/redisson-tomcat/redisson-tomcat-9/pom.xml index 5b86488e2..6fc34bbee 100644 --- a/redisson-tomcat/redisson-tomcat-9/pom.xml +++ b/redisson-tomcat/redisson-tomcat-9/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.14.2-SNAPSHOT + 2.15.0 ../ diff --git a/redisson/pom.xml b/redisson/pom.xml index c87551fc4..57c7fb180 100644 --- a/redisson/pom.xml +++ b/redisson/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.14.2-SNAPSHOT + 2.15.0 ../ From 4c897ea4efbd6ebe0587253967e21a1809e28d19 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 15:12:39 +0300 Subject: [PATCH 02/21] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- redisson-all/pom.xml | 4 ++-- redisson-hibernate/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-4/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-5/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-52/pom.xml | 2 +- redisson-hibernate/redisson-hibernate-53/pom.xml | 2 +- redisson-spring-boot-starter/pom.xml | 2 +- redisson-spring-data/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-16/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-17/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-18/pom.xml | 2 +- redisson-spring-data/redisson-spring-data-20/pom.xml | 2 +- redisson-tomcat/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-6/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-7/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-8/pom.xml | 2 +- redisson-tomcat/redisson-tomcat-9/pom.xml | 2 +- redisson/pom.xml | 2 +- 19 files changed, 21 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index f61d2046a..7ad501503 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.redisson redisson-parent - 2.15.0 + 2.15.1-SNAPSHOT pom Redisson @@ -28,7 +28,7 @@ scm:git:git@github.com:redisson/redisson.git scm:git:git@github.com:redisson/redisson.git scm:git:git@github.com:redisson/redisson.git - redisson-2.15.0 + HEAD diff --git a/redisson-all/pom.xml b/redisson-all/pom.xml index e0b6b0c92..eef3a176d 100644 --- a/redisson-all/pom.xml +++ b/redisson-all/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.15.0 + 2.15.1-SNAPSHOT ../ @@ -26,7 +26,7 @@ scm:git:git@github.com:mrniko/redisson.git scm:git:git@github.com:mrniko/redisson.git scm:git:git@github.com:mrniko/redisson.git - redisson-2.15.0 + redisson-parent-0.9.0 diff --git a/redisson-hibernate/pom.xml b/redisson-hibernate/pom.xml index ba4c5eba2..5cf667123 100644 --- a/redisson-hibernate/pom.xml +++ b/redisson-hibernate/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-hibernate/redisson-hibernate-4/pom.xml b/redisson-hibernate/redisson-hibernate-4/pom.xml index fc346e283..2c8c02b45 100644 --- a/redisson-hibernate/redisson-hibernate-4/pom.xml +++ b/redisson-hibernate/redisson-hibernate-4/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-hibernate/redisson-hibernate-5/pom.xml b/redisson-hibernate/redisson-hibernate-5/pom.xml index 319573d6f..353d6e3c7 100644 --- a/redisson-hibernate/redisson-hibernate-5/pom.xml +++ b/redisson-hibernate/redisson-hibernate-5/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-hibernate/redisson-hibernate-52/pom.xml b/redisson-hibernate/redisson-hibernate-52/pom.xml index b1796bf07..dc430c9b0 100644 --- a/redisson-hibernate/redisson-hibernate-52/pom.xml +++ b/redisson-hibernate/redisson-hibernate-52/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-hibernate/redisson-hibernate-53/pom.xml b/redisson-hibernate/redisson-hibernate-53/pom.xml index 6427d5bd1..5436c5adf 100644 --- a/redisson-hibernate/redisson-hibernate-53/pom.xml +++ b/redisson-hibernate/redisson-hibernate-53/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-hibernate - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-spring-boot-starter/pom.xml b/redisson-spring-boot-starter/pom.xml index 22943b724..29316c50e 100644 --- a/redisson-spring-boot-starter/pom.xml +++ b/redisson-spring-boot-starter/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-spring-data/pom.xml b/redisson-spring-data/pom.xml index d26891a0c..bc722090b 100644 --- a/redisson-spring-data/pom.xml +++ b/redisson-spring-data/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-spring-data/redisson-spring-data-16/pom.xml b/redisson-spring-data/redisson-spring-data-16/pom.xml index 5f2c76b14..6f2380f6b 100644 --- a/redisson-spring-data/redisson-spring-data-16/pom.xml +++ b/redisson-spring-data/redisson-spring-data-16/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-spring-data/redisson-spring-data-17/pom.xml b/redisson-spring-data/redisson-spring-data-17/pom.xml index 09c366c7e..2d7a5e51c 100644 --- a/redisson-spring-data/redisson-spring-data-17/pom.xml +++ b/redisson-spring-data/redisson-spring-data-17/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-spring-data/redisson-spring-data-18/pom.xml b/redisson-spring-data/redisson-spring-data-18/pom.xml index 43c66d46a..af237ee59 100644 --- a/redisson-spring-data/redisson-spring-data-18/pom.xml +++ b/redisson-spring-data/redisson-spring-data-18/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-spring-data/redisson-spring-data-20/pom.xml b/redisson-spring-data/redisson-spring-data-20/pom.xml index 6485c6972..21fd9a827 100644 --- a/redisson-spring-data/redisson-spring-data-20/pom.xml +++ b/redisson-spring-data/redisson-spring-data-20/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-spring-data - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-tomcat/pom.xml b/redisson-tomcat/pom.xml index df0b3ab73..11ccb85d3 100644 --- a/redisson-tomcat/pom.xml +++ b/redisson-tomcat/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-tomcat/redisson-tomcat-6/pom.xml b/redisson-tomcat/redisson-tomcat-6/pom.xml index 362a07461..40b1fdb6b 100644 --- a/redisson-tomcat/redisson-tomcat-6/pom.xml +++ b/redisson-tomcat/redisson-tomcat-6/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-tomcat/redisson-tomcat-7/pom.xml b/redisson-tomcat/redisson-tomcat-7/pom.xml index dbcc3a1e8..20c07e46c 100644 --- a/redisson-tomcat/redisson-tomcat-7/pom.xml +++ b/redisson-tomcat/redisson-tomcat-7/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-tomcat/redisson-tomcat-8/pom.xml b/redisson-tomcat/redisson-tomcat-8/pom.xml index aa0aff5ef..3896b9a51 100644 --- a/redisson-tomcat/redisson-tomcat-8/pom.xml +++ b/redisson-tomcat/redisson-tomcat-8/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson-tomcat/redisson-tomcat-9/pom.xml b/redisson-tomcat/redisson-tomcat-9/pom.xml index 6fc34bbee..d6cb2305e 100644 --- a/redisson-tomcat/redisson-tomcat-9/pom.xml +++ b/redisson-tomcat/redisson-tomcat-9/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-tomcat - 2.15.0 + 2.15.1-SNAPSHOT ../ diff --git a/redisson/pom.xml b/redisson/pom.xml index 57c7fb180..1c134525e 100644 --- a/redisson/pom.xml +++ b/redisson/pom.xml @@ -4,7 +4,7 @@ org.redisson redisson-parent - 2.15.0 + 2.15.1-SNAPSHOT ../ From 0f27a58cdbfc8875920ac5d95cd2315b39c3296b Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:08:09 +0300 Subject: [PATCH 03/21] Update CHANGELOG.md --- CHANGELOG.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75111cd43..bd5164179 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,42 @@ Redisson Releases History ================================ ### Please Note: trunk is current development branch. -Please consider __[Redisson PRO](https://redisson.pro)__ version for advanced features and support by SLA. +Сonsider __[Redisson PRO](https://redisson.pro)__ version for advanced features and support by SLA. + +### 27-Dec-2018 - versions 2.15.0 and 3.10.0 released +Feature - new __[Hibernate cache](https://github.com/redisson/redisson/tree/master/redisson-hibernate) implementation__ +Feature - __Hibernate 5.3__ support +Feature - [TypedJsonJacksonCodec](https://github.com/redisson/redisson/blob/master/redisson/src/main/java/org/redisson/codec/TypedJsonJacksonCodec.java) added +Feature - `getCountDownLatch`, `getSemaphore`, `getPermitExpirableSemaphore`, `getFairLock` methods added to `RMap` object +Feature - `getCountDownLatch`, `getSemaphore`, `getPermitExpirableSemaphore`, `getFairLock` methods added to `RSet` object +Feature - `RTopic.countSubscribers` method added +Feature - `JndiRedissonFactory` and Tomcat `JndiRedissonSessionManager` added +Feature - Hibernate Region Factories with JNDI support +Feature - ability to use Environmental Variables in config files +Feature - Spring Data Redis 2.1.x support added +Feature - Spring Data Redis 2.x and 2.1 integrations support `ReactiveRedisTemplate` +Improvement - RGeo.radius methods use GEORADIUS_RO and GEORADIUSBYMEMBER_RO commands +Improvement - restored implementation of DnsAddressResolverGroupFactory +Improvement - RedisConnectionClosedException removed +Fixed - `RMap.getAll` throws `ClassCastException` during transaction execution +Fixed - `pingConnectionInterval` and `lock-watchdog-timeout` parameters added to `redisson.xsd` +Fixed - zRevRangeWithScores does not work properly in Spring RedisTemplate +Fixed - `CommandDecoder` throws `IndexOutOfBoundsException` if `pingConnectionInterval` param is used +Fixed - NPE in `CommandDecoder` +Fixed - error during channel initialization is not logged +Fixed - `RBitSet` object couldn't be used as nested object +Fixed - use `keyPrefix` for topic object used in Tomcat Session Manager +Fixed - unable connect to Redis on Android +Fixed - `RMapCache` element expiration doesn't work with map size = 1 +Fixed - MOVED handling +Fixed - Pooled connection closed after MOVED redirection +Fixed - Master node shouldn't be shutdown on slave down event in Sentinel mode +Fixed - `RoundRobinLoadBalancer` doesn't distribute load equally if one of slave nodes failed +Fixed - Spring Session `keyPrefix` setting isn't used in session name +Fixed - failed Redis Master node is not shutdown properly +Fixed - Redisson shouldn't be shutdown in Spring Data RedissonConnectionFactory +Fixed - Redisson Spring Boot doesn't start properly without lettuce or jedis in classpath +Fixed - validation of filled out Redis node address in Config ### 21-Nov-2018 - versions 2.14.1 and 3.9.1 released Feature - `takeFirstElements` and `takeLastElements` streaming methods added to `RBlockingDequeRx` From d5eae591e99a24057bfb9284604a23b8a1e4071a Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:10:09 +0300 Subject: [PATCH 04/21] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd5164179..8af5eab90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Feature - Hibernate Region Factories with JNDI support Feature - ability to use Environmental Variables in config files Feature - Spring Data Redis 2.1.x support added Feature - Spring Data Redis 2.x and 2.1 integrations support `ReactiveRedisTemplate` +Feature - Support of [Different monitoring systems](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks#1410-statistics-monitoring-jmx-and-other-systems) Improvement - RGeo.radius methods use GEORADIUS_RO and GEORADIUSBYMEMBER_RO commands Improvement - restored implementation of DnsAddressResolverGroupFactory Improvement - RedisConnectionClosedException removed From f31ba3f9093952ef2afe72420aace5fe0f93132d Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:11:34 +0300 Subject: [PATCH 05/21] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8af5eab90..a46ade054 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Feature - `JndiRedissonFactory` and Tomcat `JndiRedissonSessionManager` added Feature - Hibernate Region Factories with JNDI support Feature - ability to use Environmental Variables in config files Feature - Spring Data Redis 2.1.x support added +Feature - Spring Boot Starter 2.1.x support added Feature - Spring Data Redis 2.x and 2.1 integrations support `ReactiveRedisTemplate` Feature - Support of [Different monitoring systems](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks#1410-statistics-monitoring-jmx-and-other-systems) Improvement - RGeo.radius methods use GEORADIUS_RO and GEORADIUSBYMEMBER_RO commands From 5b3fc46e82f023c9b96e2a71cf851e34ca3f1fa5 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:16:21 +0300 Subject: [PATCH 06/21] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a46ade054..578e8a56b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ Feature - Hibernate Region Factories with JNDI support Feature - ability to use Environmental Variables in config files Feature - Spring Data Redis 2.1.x support added Feature - Spring Boot Starter 2.1.x support added -Feature - Spring Data Redis 2.x and 2.1 integrations support `ReactiveRedisTemplate` +Feature - Spring Data Redis 2.0.x and 2.1.x integrations support `ReactiveRedisTemplate` Feature - Support of [Different monitoring systems](https://github.com/redisson/redisson/wiki/14.-Integration-with-frameworks#1410-statistics-monitoring-jmx-and-other-systems) Improvement - RGeo.radius methods use GEORADIUS_RO and GEORADIUSBYMEMBER_RO commands Improvement - restored implementation of DnsAddressResolverGroupFactory From f09bb23fe6e6e5b440cb9a10f2c65732b59565a5 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:18:04 +0300 Subject: [PATCH 07/21] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 936e10059..bc0771c0f 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ Redisson: Redis based In-Memory Data Grid for Java.
State of the Art Redis Java client ==== -[Quick start](https://github.com/redisson/redisson#quick-start) | [Documentation](https://github.com/redisson/redisson/wiki) | [Javadocs](http://www.javadoc.io/doc/org.redisson/redisson/3.8.2) | [Changelog](https://github.com/redisson/redisson/blob/master/CHANGELOG.md) | [Code examples](https://github.com/redisson/redisson-examples) | [FAQs](https://github.com/redisson/redisson/wiki/16.-FAQ) | [Report an issue](https://github.com/redisson/redisson/issues/new) | **[Redisson PRO](https://redisson.pro)** +[Quick start](https://github.com/redisson/redisson#quick-start) | [Documentation](https://github.com/redisson/redisson/wiki) | [Javadocs](http://www.javadoc.io/doc/org.redisson/redisson/3.9.1) | [Changelog](https://github.com/redisson/redisson/blob/master/CHANGELOG.md) | [Code examples](https://github.com/redisson/redisson-examples) | [FAQs](https://github.com/redisson/redisson/wiki/16.-FAQ) | [Report an issue](https://github.com/redisson/redisson/issues/new) | **[Redisson PRO](https://redisson.pro)** Based on high-performance async and lock-free Java Redis client and [Netty](http://netty.io) framework. | Stable
Release Version | Release Date | JDK Version
compatibility | `CompletionStage`
support | `ProjectReactor` version
compatibility | | ------------- | ------------- | ------------| -----------| -----------| -| 3.9.1 | 21.11.2018 | 1.8 - 11, Android | Yes | 3.x.x | -| 2.14.1 | 21.11.2018 | 1.6 - 11, Android | No | 2.0.8 | +| 3.10.0 | 27.12.2018 | 1.8 - 11, Android | Yes | 3.x.x | +| 2.15.0 | 27.12.2018 | 1.6 - 11, Android | No | 2.0.8 | Features @@ -110,23 +110,23 @@ Quick start org.redisson redisson - 3.9.1 + 3.10.0 org.redisson redisson - 2.14.1 + 2.15.0 #### Gradle // JDK 1.8+ compatible - compile 'org.redisson:redisson:3.9.1' + compile 'org.redisson:redisson:3.10.0' // JDK 1.6+ compatible - compile 'org.redisson:redisson:2.14.1' + compile 'org.redisson:redisson:2.15.0' #### Java @@ -153,11 +153,11 @@ RExecutorService executor = redisson.getExecutorService("myExecutorService"); Downloads =============================== -[Redisson 3.9.1](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson&v=3.9.1&e=jar), -[Redisson node 3.9.1](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=3.9.1&e=jar) +[Redisson 3.10.0](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson&v=3.10.0&e=jar), +[Redisson node 3.10.0](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=3.10.0&e=jar) -[Redisson 2.14.1](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson&v=2.14.1&e=jar), -[Redisson node 2.14.1](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=2.14.1&e=jar) +[Redisson 2.15.0](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson&v=2.15.0&e=jar), +[Redisson node 2.15.0](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=2.15.0&e=jar) FAQs =============================== From fee8ca543a58a175a9e3c601b0e51a13fe2cb29d Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:19:37 +0300 Subject: [PATCH 08/21] Update README.md --- redisson-tomcat/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/redisson-tomcat/README.md b/redisson-tomcat/README.md index f0ce4733b..d7ce7692d 100644 --- a/redisson-tomcat/README.md +++ b/redisson-tomcat/README.md @@ -66,25 +66,25 @@ Each RedissonSessionManager created per Web Application and thus creates own Red **2** Copy two jars into `TOMCAT_BASE/lib` directory: 1. __For JDK 1.8+__ - [redisson-all-3.9.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=3.9.1&e=jar) + [redisson-all-3.10.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=3.10.0&e=jar) for Tomcat 6.x - [redisson-tomcat-6-3.9.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-6&v=3.9.1&e=jar) + [redisson-tomcat-6-3.10.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-6&v=3.10.0&e=jar) for Tomcat 7.x - [redisson-tomcat-7-3.9.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-7&v=3.9.1&e=jar) + [redisson-tomcat-7-3.10.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-7&v=3.10.0&e=jar) for Tomcat 8.x - [redisson-tomcat-8-3.9.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-8&v=3.9.1&e=jar) + [redisson-tomcat-8-3.10.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-8&v=3.10.0&e=jar) for Tomcat 9.x - [redisson-tomcat-9-3.9.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-9&v=3.9.1&e=jar) + [redisson-tomcat-9-3.10.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-9&v=3.10.0&e=jar) 2. __For JDK 1.6+__ - [redisson-all-2.14.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=2.14.1&e=jar) + [redisson-all-2.15.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-all&v=2.15.0&e=jar) for Tomcat 6.x - [redisson-tomcat-6-2.14.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-6&v=2.14.1&e=jar) + [redisson-tomcat-6-2.15.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-6&v=2.15.0&e=jar) for Tomcat 7.x - [redisson-tomcat-7-2.14.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-7&v=2.14.1&e=jar) + [redisson-tomcat-7-2.15.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-7&v=2.15.0&e=jar) for Tomcat 8.x - [redisson-tomcat-8-2.14.1.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-8&v=2.14.1&e=jar) + [redisson-tomcat-8-2.15.0.jar](https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.redisson&a=redisson-tomcat-8&v=2.15.0&e=jar) From 92e77486c49b40e37fdf30939631dc6a65ecac95 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:20:43 +0300 Subject: [PATCH 09/21] Update README.md --- redisson-spring-data/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/redisson-spring-data/README.md b/redisson-spring-data/README.md index f4e5783fb..620eaa968 100644 --- a/redisson-spring-data/README.md +++ b/redisson-spring-data/README.md @@ -28,22 +28,22 @@ Usage redisson-spring-data-20 redisson-spring-data-21 - 3.9.1 + 3.10.0 ``` Gradle ```java // for Spring Data Redis v.1.6.x - compile 'org.redisson:redisson-spring-data-16:3.9.1' + compile 'org.redisson:redisson-spring-data-16:3.10.0' // for Spring Data Redis v.1.7.x - compile 'org.redisson:redisson-spring-data-17:3.9.1' + compile 'org.redisson:redisson-spring-data-17:3.10.0' // for Spring Data Redis v.1.8.x - compile 'org.redisson:redisson-spring-data-18:3.9.1' + compile 'org.redisson:redisson-spring-data-18:3.10.0' // for Spring Data Redis v.2.0.x - compile 'org.redisson:redisson-spring-data-20:3.9.1' + compile 'org.redisson:redisson-spring-data-20:3.10.0' // for Spring Data Redis v.2.1.x - compile 'org.redisson:redisson-spring-data-21:3.9.1' + compile 'org.redisson:redisson-spring-data-21:3.10.0' ``` 2. __For JDK 1.6+__ @@ -58,18 +58,18 @@ Usage redisson-spring-data-17 redisson-spring-data-18 - 2.14.1 + 2.15.0 ``` Gradle ```java // for Spring Data Redis v.1.6.x - compile 'org.redisson:redisson-spring-data-16:2.14.1' + compile 'org.redisson:redisson-spring-data-16:2.15.0' // for Spring Data Redis v.1.7.x - compile 'org.redisson:redisson-spring-data-17:2.14.1' + compile 'org.redisson:redisson-spring-data-17:2.15.0' // for Spring Data Redis v.1.8.x - compile 'org.redisson:redisson-spring-data-18:2.14.1' + compile 'org.redisson:redisson-spring-data-18:2.15.0' ``` From 0d2e50afda068ce3c94b0bc5fd57a0b279435b2f Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:23:42 +0300 Subject: [PATCH 10/21] Update README.md --- redisson-spring-boot-starter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redisson-spring-boot-starter/README.md b/redisson-spring-boot-starter/README.md index 1e91dc9d0..b11c74f76 100644 --- a/redisson-spring-boot-starter/README.md +++ b/redisson-spring-boot-starter/README.md @@ -67,5 +67,5 @@ spring.redis.sentinel.nodes= spring.redis.redisson.config=classpath:redisson.yaml ``` -### 3. Get access to Redisson through spring bean with `RedissonClient` interface +### 3. Get access to Redisson through spring bean with `RedissonClient` interface or `RedisTemplate`/`ReactiveRedisTemplate` objects From 82baf9a75f0e09b8bc4c4d31a1228bbfa6434b50 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Thu, 27 Dec 2018 16:24:03 +0300 Subject: [PATCH 11/21] Update README.md --- redisson-spring-boot-starter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redisson-spring-boot-starter/README.md b/redisson-spring-boot-starter/README.md index b11c74f76..dcdcf8cdb 100644 --- a/redisson-spring-boot-starter/README.md +++ b/redisson-spring-boot-starter/README.md @@ -67,5 +67,5 @@ spring.redis.sentinel.nodes= spring.redis.redisson.config=classpath:redisson.yaml ``` -### 3. Get access to Redisson through spring bean with `RedissonClient` interface or `RedisTemplate`/`ReactiveRedisTemplate` objects +### 3. Use Redisson through spring bean with `RedissonClient` interface or `RedisTemplate`/`ReactiveRedisTemplate` objects From bb8990e8d0373b3b8b723a0d02539da084c96a38 Mon Sep 17 00:00:00 2001 From: Mikhail Surin Date: Fri, 28 Dec 2018 00:42:43 +0500 Subject: [PATCH 12/21] Fix URIBuilder compare method for IPv6 hosts --- .../src/main/java/org/redisson/misc/URIBuilder.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/redisson/src/main/java/org/redisson/misc/URIBuilder.java b/redisson/src/main/java/org/redisson/misc/URIBuilder.java index d08c43b4c..6165dcd1b 100644 --- a/redisson/src/main/java/org/redisson/misc/URIBuilder.java +++ b/redisson/src/main/java/org/redisson/misc/URIBuilder.java @@ -70,10 +70,17 @@ public class URIBuilder { throw new IOException(e); } } - + + private static String trimIpv6Brackets(String host) { + if (host.startsWith("[") && host.endsWith("]")) { + return host.substring(1, host.length() - 1); + } + return host; + } + public static boolean compare(InetSocketAddress entryAddr, URI addr) { - if (((entryAddr.getHostName() != null && entryAddr.getHostName().equals(addr.getHost())) - || entryAddr.getAddress().getHostAddress().equals(addr.getHost())) + if (((entryAddr.getHostName() != null && entryAddr.getHostName().equals(trimIpv6Brackets(addr.getHost()))) + || entryAddr.getAddress().getHostAddress().equals(trimIpv6Brackets(addr.getHost()))) && entryAddr.getPort() == addr.getPort()) { return true; } From 6a99bd6efffd77a1d6bc423d941c060730e10ff7 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 28 Dec 2018 16:39:17 +0300 Subject: [PATCH 13/21] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 578e8a56b..faefc74d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Feature - Support of [Different monitoring systems](https://github.com/redisson/ Improvement - RGeo.radius methods use GEORADIUS_RO and GEORADIUSBYMEMBER_RO commands Improvement - restored implementation of DnsAddressResolverGroupFactory Improvement - RedisConnectionClosedException removed +Improvement - __default codec changed to FSTCodec__ Fixed - `RMap.getAll` throws `ClassCastException` during transaction execution Fixed - `pingConnectionInterval` and `lock-watchdog-timeout` parameters added to `redisson.xsd` Fixed - zRevRangeWithScores does not work properly in Spring RedisTemplate From 484c3a87ce2a1a3b882b8f167d2b5db37ea03da8 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 28 Dec 2018 17:05:27 +0300 Subject: [PATCH 14/21] refactoring --- .../redisson/misc/RedissonObjectFactory.java | 50 +++++++------------ 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java index 15406edad..dc4c6e167 100644 --- a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java +++ b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java @@ -46,7 +46,7 @@ import org.redisson.liveobject.resolver.NamingScheme; */ public class RedissonObjectFactory { - public static class RedissonObjectBuilder { + public static class CodecMethodRef { Method defaultCodecMethod; Method customCodecMethod; @@ -59,37 +59,26 @@ public class RedissonObjectFactory { } } - private static final Map, RedissonObjectBuilder> builders; + private static final Map, CodecMethodRef> references; static { - HashMap, RedissonObjectBuilder> b = new HashMap, RedissonObjectBuilder>(); - for (Method method : RedissonClient.class.getDeclaredMethods()) { - if (!method.getReturnType().equals(Void.TYPE) - && RObject.class.isAssignableFrom(method.getReturnType()) - && method.getName().startsWith("get")) { - Class cls = method.getReturnType(); - if (!b.containsKey(cls)) { - b.put(cls, new RedissonObjectBuilder()); - } - RedissonObjectBuilder builder = b.get(cls); - if (method.getParameterTypes().length == 2 //first param is name, second param is codec. - && Codec.class.isAssignableFrom(method.getParameterTypes()[1])) { - builder.customCodecMethod = method; - } else if (method.getParameterTypes().length == 1) { - builder.defaultCodecMethod = method; - } - } - } + HashMap, CodecMethodRef> b = new HashMap, CodecMethodRef>(); + fillCodecMethods(b, RedissonClient.class, RObject.class); + fillCodecMethods(b, RedissonReactiveClient.class, RObjectReactive.class); - for (Method method : RedissonReactiveClient.class.getDeclaredMethods()) { + references = Collections.unmodifiableMap(b); + } + + private static void fillCodecMethods(HashMap, CodecMethodRef> b, Class clientClazz, Class objectClazz) { + for (Method method : clientClazz.getDeclaredMethods()) { if (!method.getReturnType().equals(Void.TYPE) - && RObjectReactive.class.isAssignableFrom(method.getReturnType()) + && objectClazz.isAssignableFrom(method.getReturnType()) && method.getName().startsWith("get")) { Class cls = method.getReturnType(); if (!b.containsKey(cls)) { - b.put(cls, new RedissonObjectBuilder()); + b.put(cls, new CodecMethodRef()); } - RedissonObjectBuilder builder = b.get(cls); + CodecMethodRef builder = b.get(cls); if (method.getParameterTypes().length == 2 //first param is name, second param is codec. && Codec.class.isAssignableFrom(method.getParameterTypes()[1])) { builder.customCodecMethod = method; @@ -98,9 +87,6 @@ public class RedissonObjectFactory { } } } - - builders = Collections.unmodifiableMap(b); - } public static Object fromReference(RedissonClient redisson, RedissonReference rr) throws Exception { @@ -121,15 +107,15 @@ public class RedissonObjectFactory { return getObject(redisson, rr, type, codecProvider); } - protected static Object getObject(Object redisson, RedissonReference rr, Class type, + private static Object getObject(Object redisson, RedissonReference rr, Class type, ReferenceCodecProvider codecProvider) throws IllegalAccessException, InvocationTargetException, Exception, ClassNotFoundException { if (type != null) { - RedissonObjectBuilder b = builders.get(type); + CodecMethodRef b = references.get(type); if (b == null && type.getInterfaces().length > 0) { type = type.getInterfaces()[0]; } - b = builders.get(type); + b = references.get(type); if (b != null) { Method builder = b.get(isDefaultCodec(rr)); return (isDefaultCodec(rr) @@ -210,8 +196,8 @@ public class RedissonObjectFactory { public static T createRObject(RedissonClient redisson, Class expectedType, String name, K codec) throws Exception { List> interfaces = Arrays.asList(expectedType.getInterfaces()); for (Class iType : interfaces) { - if (builders.containsKey(iType)) {// user cache to speed up things a little. - Method builder = builders.get(iType).get(codec != null); + if (references.containsKey(iType)) {// user cache to speed up things a little. + Method builder = references.get(iType).get(codec != null); return (T) (codec != null ? builder.invoke(redisson, name) : builder.invoke(redisson, name, codec)); From 33f8cbba75479b26d63a8357bb50f8706571ff0a Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 28 Dec 2018 18:51:48 +0300 Subject: [PATCH 15/21] refactoring --- .../src/main/java/org/redisson/Redisson.java | 4 +- .../redisson/RedissonLiveObjectService.java | 15 +- .../java/org/redisson/RedissonObject.java | 7 +- .../java/org/redisson/RedissonScript.java | 4 +- .../main/java/org/redisson/RedissonTopic.java | 3 +- .../command/CommandAsyncExecutor.java | 3 + .../redisson/command/CommandAsyncService.java | 20 +- .../liveobject/core/AccessorInterceptor.java | 10 +- .../core/RedissonObjectBuilder.java | 195 ++++++++++++++-- .../redisson/misc/RedissonObjectFactory.java | 210 ------------------ 10 files changed, 214 insertions(+), 257 deletions(-) delete mode 100644 redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java diff --git a/redisson/src/main/java/org/redisson/Redisson.java b/redisson/src/main/java/org/redisson/Redisson.java index 45df4ab55..147327be3 100755 --- a/redisson/src/main/java/org/redisson/Redisson.java +++ b/redisson/src/main/java/org/redisson/Redisson.java @@ -85,7 +85,6 @@ import org.redisson.config.Config; import org.redisson.config.ConfigSupport; import org.redisson.connection.ConnectionManager; import org.redisson.eviction.EvictionScheduler; -import org.redisson.misc.RedissonObjectFactory; import org.redisson.pubsub.SemaphorePubSub; import org.redisson.remote.ResponseEntry; import org.redisson.transaction.RedissonTransaction; @@ -102,7 +101,6 @@ import io.netty.util.internal.PlatformDependent; public class Redisson implements RedissonClient { static { - RedissonObjectFactory.warmUp(); RedissonReference.warmUp(); } @@ -657,7 +655,7 @@ public class Redisson implements RedissonClient { @Override public RLiveObjectService getLiveObjectService() { - return new RedissonLiveObjectService(this, liveObjectClassCache); + return new RedissonLiveObjectService(this, liveObjectClassCache, connectionManager.getCommandExecutor()); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java b/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java index fc5cb0326..3f6773312 100644 --- a/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java +++ b/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java @@ -54,6 +54,7 @@ import org.redisson.api.annotation.RCascade; import org.redisson.api.annotation.REntity; import org.redisson.api.annotation.RFieldAccessor; import org.redisson.api.annotation.RId; +import org.redisson.command.CommandAsyncExecutor; import org.redisson.liveobject.LiveObjectTemplate; import org.redisson.liveobject.core.AccessorInterceptor; import org.redisson.liveobject.core.FieldAccessorInterceptor; @@ -61,7 +62,6 @@ import org.redisson.liveobject.core.LiveObjectInterceptor; import org.redisson.liveobject.core.RExpirableInterceptor; import org.redisson.liveobject.core.RMapInterceptor; import org.redisson.liveobject.core.RObjectInterceptor; -import org.redisson.liveobject.core.RedissonObjectBuilder; import org.redisson.liveobject.misc.AdvBeanCopy; import org.redisson.liveobject.misc.ClassUtils; import org.redisson.liveobject.misc.Introspectior; @@ -84,12 +84,12 @@ public class RedissonLiveObjectService implements RLiveObjectService { private static final ConcurrentMap, Resolver> providerCache = PlatformDependent.newConcurrentHashMap(); private final ConcurrentMap, Class> classCache; private final RedissonClient redisson; - private final RedissonObjectBuilder objectBuilder; + private final CommandAsyncExecutor commandExecutor; - public RedissonLiveObjectService(RedissonClient redisson, ConcurrentMap, Class> classCache) { + public RedissonLiveObjectService(RedissonClient redisson, ConcurrentMap, Class> classCache, CommandAsyncExecutor commandExecutor) { this.redisson = redisson; this.classCache = classCache; - this.objectBuilder = new RedissonObjectBuilder(redisson); + this.commandExecutor = commandExecutor; } //TODO: Add ttl renewal functionality @@ -204,9 +204,9 @@ public class RedissonLiveObjectService implements RLiveObjectService { continue; } - RObject rObject = objectBuilder.createObject(id, detachedObject.getClass(), object.getClass(), field.getName()); + RObject rObject = commandExecutor.getObjectBuilder().createObject(id, detachedObject.getClass(), object.getClass(), field.getName(), redisson); if (rObject != null) { - objectBuilder.store(rObject, field.getName(), liveMap); + commandExecutor.getObjectBuilder().store(rObject, field.getName(), liveMap); if (rObject instanceof SortedSet) { ((RSortedSet)rObject).trySetComparator(((SortedSet)object).comparator()); } @@ -696,8 +696,7 @@ public class RedissonLiveObjectService implements RLiveObjectService { .and(ElementMatchers.isPublic() .or(ElementMatchers.isProtected())) ) - .intercept(MethodDelegation.to( - new AccessorInterceptor(redisson, objectBuilder))) + .intercept(MethodDelegation.to(new AccessorInterceptor(redisson, commandExecutor.getObjectBuilder()))) .make().load(entityClass.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) diff --git a/redisson/src/main/java/org/redisson/RedissonObject.java b/redisson/src/main/java/org/redisson/RedissonObject.java index 2592756fe..047ecad56 100644 --- a/redisson/src/main/java/org/redisson/RedissonObject.java +++ b/redisson/src/main/java/org/redisson/RedissonObject.java @@ -29,7 +29,6 @@ import org.redisson.client.codec.Codec; import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.RedisCommands; import org.redisson.command.CommandAsyncExecutor; -import org.redisson.misc.RedissonObjectFactory; import io.netty.buffer.ByteBuf; @@ -240,7 +239,7 @@ public abstract class RedissonObject implements RObject { public ByteBuf encode(Object value) { if (commandExecutor.isRedissonReferenceSupportEnabled()) { - RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value); + RedissonReference reference = commandExecutor.getObjectBuilder().toReference(value); if (reference != null) { value = reference; } @@ -255,7 +254,7 @@ public abstract class RedissonObject implements RObject { public ByteBuf encodeMapKey(Object value) { if (commandExecutor.isRedissonReferenceSupportEnabled()) { - RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value); + RedissonReference reference = commandExecutor.getObjectBuilder().toReference(value); if (reference != null) { value = reference; } @@ -270,7 +269,7 @@ public abstract class RedissonObject implements RObject { public ByteBuf encodeMapValue(Object value) { if (commandExecutor.isRedissonReferenceSupportEnabled()) { - RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value); + RedissonReference reference = commandExecutor.getObjectBuilder().toReference(value); if (reference != null) { value = reference; } diff --git a/redisson/src/main/java/org/redisson/RedissonScript.java b/redisson/src/main/java/org/redisson/RedissonScript.java index 681dbd2ea..e5f9ff3de 100644 --- a/redisson/src/main/java/org/redisson/RedissonScript.java +++ b/redisson/src/main/java/org/redisson/RedissonScript.java @@ -29,7 +29,7 @@ import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.RedisCommand; import org.redisson.client.protocol.RedisCommands; import org.redisson.command.CommandAsyncExecutor; -import org.redisson.misc.RedissonObjectFactory; +import org.redisson.liveobject.core.RedissonObjectBuilder; import io.netty.buffer.ByteBuf; @@ -257,7 +257,7 @@ public class RedissonScript implements RScript { private ByteBuf encode(Object value, Codec codec) { if (commandExecutor.isRedissonReferenceSupportEnabled()) { - RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value); + RedissonReference reference = commandExecutor.getObjectBuilder().toReference(value); if (reference != null) { value = reference; } diff --git a/redisson/src/main/java/org/redisson/RedissonTopic.java b/redisson/src/main/java/org/redisson/RedissonTopic.java index 6ea6d403f..a1a1aa85c 100644 --- a/redisson/src/main/java/org/redisson/RedissonTopic.java +++ b/redisson/src/main/java/org/redisson/RedissonTopic.java @@ -33,7 +33,6 @@ import org.redisson.client.protocol.RedisCommands; import org.redisson.command.CommandAsyncExecutor; import org.redisson.config.MasterSlaveServersConfig; import org.redisson.misc.RPromise; -import org.redisson.misc.RedissonObjectFactory; import org.redisson.misc.RedissonPromise; import org.redisson.misc.TransferListener; import org.redisson.pubsub.AsyncSemaphore; @@ -87,7 +86,7 @@ public class RedissonTopic implements RTopic { protected ByteBuf encode(Object value) { if (commandExecutor.isRedissonReferenceSupportEnabled()) { - RedissonReference reference = RedissonObjectFactory.toReference(commandExecutor.getConnectionManager().getCfg(), value); + RedissonReference reference = commandExecutor.getObjectBuilder().toReference(value); if (reference != null) { value = reference; } diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java b/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java index 2121e3da2..67bca00e7 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java @@ -30,6 +30,7 @@ import org.redisson.client.codec.Codec; import org.redisson.client.protocol.RedisCommand; import org.redisson.connection.ConnectionManager; import org.redisson.connection.MasterSlaveEntry; +import org.redisson.liveobject.core.RedissonObjectBuilder; /** * @@ -38,6 +39,8 @@ import org.redisson.connection.MasterSlaveEntry; */ public interface CommandAsyncExecutor { + RedissonObjectBuilder getObjectBuilder(); + ConnectionManager getConnectionManager(); CommandAsyncExecutor enableRedissonReferenceSupport(RedissonClient redisson); diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index 1934e7f8c..816ecc2c6 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -65,9 +65,9 @@ import org.redisson.connection.ConnectionManager; import org.redisson.connection.MasterSlaveEntry; import org.redisson.connection.NodeSource; import org.redisson.connection.NodeSource.Redirect; +import org.redisson.liveobject.core.RedissonObjectBuilder; import org.redisson.misc.LogHelper; import org.redisson.misc.RPromise; -import org.redisson.misc.RedissonObjectFactory; import org.redisson.misc.RedissonPromise; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,7 +75,6 @@ import org.slf4j.LoggerFactory; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufUtil; -import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.util.ReferenceCountUtil; @@ -94,6 +93,7 @@ public class CommandAsyncService implements CommandAsyncExecutor { static final Logger log = LoggerFactory.getLogger(CommandAsyncService.class); final ConnectionManager connectionManager; + private RedissonObjectBuilder objectBuilder; protected RedissonClient redisson; protected RedissonReactiveClient redissonReactive; protected RedissonRxClient redissonRx; @@ -144,6 +144,7 @@ public class CommandAsyncService implements CommandAsyncExecutor { Codec codec = config.getCodec(); ReferenceCodecProvider codecProvider = config.getReferenceCodecProvider(); codecProvider.registerCodec((Class) codec.getClass(), codec); + objectBuilder = new RedissonObjectBuilder(config); } @Override @@ -1192,14 +1193,18 @@ public class CommandAsyncService implements CommandAsyncExecutor { } private Object fromReference(Object res) { + if (objectBuilder == null) { + return res; + } + try { if (redisson != null) { - return RedissonObjectFactory.fromReference(redisson, (RedissonReference) res); + return objectBuilder.fromReference(redisson, (RedissonReference) res); } if (redissonReactive != null) { - return RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) res); + return objectBuilder.fromReference(redissonReactive, (RedissonReference) res); } - return RedissonObjectFactory.fromReference(redissonRx, (RedissonReference) res); + return objectBuilder.fromReference(redissonRx, (RedissonReference) res); } catch (Exception exception) { throw new IllegalStateException(exception); } @@ -1223,4 +1228,9 @@ public class CommandAsyncService implements CommandAsyncExecutor { details.setWriteFuture(future); } } + + @Override + public RedissonObjectBuilder getObjectBuilder() { + return objectBuilder; + } } diff --git a/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java b/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java index c83f29f81..d8efd3c37 100644 --- a/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java +++ b/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java @@ -32,7 +32,6 @@ import org.redisson.client.codec.Codec; import org.redisson.liveobject.misc.ClassUtils; import org.redisson.liveobject.misc.Introspectior; import org.redisson.liveobject.resolver.NamingScheme; -import org.redisson.misc.RedissonObjectFactory; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.FieldValue; @@ -76,7 +75,7 @@ public class AccessorInterceptor { if (isGetter(method, fieldName)) { Object result = liveMap.get(fieldName); if (result == null) { - RObject ar = objectBuilder.createObject(((RLiveObject) me).getLiveObjectId(), me.getClass().getSuperclass(), fieldType, fieldName); + RObject ar = objectBuilder.createObject(((RLiveObject) me).getLiveObjectId(), me.getClass().getSuperclass(), fieldType, fieldName, redisson); if (ar != null) { objectBuilder.store(ar, fieldName, liveMap); return ar; @@ -90,7 +89,7 @@ public class AccessorInterceptor { return result; } if (result instanceof RedissonReference) { - return RedissonObjectFactory.fromReference(redisson, (RedissonReference) result); + return objectBuilder.fromReference(redisson, (RedissonReference) result); } return result; } @@ -105,9 +104,10 @@ public class AccessorInterceptor { Class rEntity = liveObject.getClass().getSuperclass(); REntity anno = ClassUtils.getAnnotation(rEntity, REntity.class); + Codec codec = redisson.getConfig().getReferenceCodecProvider().getCodec(anno, rEntity, redisson.getConfig()); NamingScheme ns = anno.namingScheme() .getDeclaredConstructor(Codec.class) - .newInstance(redisson.getConfig().getReferenceCodecProvider().getCodec(anno, (Class) rEntity, redisson.getConfig())); + .newInstance(codec); liveMap.fastPut(fieldName, new RedissonReference(rEntity, ns.getName(rEntity, fieldType, getREntityIdFieldName(liveObject), liveObject.getLiveObjectId()))); @@ -119,7 +119,7 @@ public class AccessorInterceptor { && TransformationMode.ANNOTATION_BASED .equals(ClassUtils.getAnnotation(me.getClass().getSuperclass(), REntity.class).fieldTransformation())) { - RObject rObject = objectBuilder.createObject(((RLiveObject) me).getLiveObjectId(), me.getClass().getSuperclass(), arg.getClass(), fieldName); + RObject rObject = objectBuilder.createObject(((RLiveObject) me).getLiveObjectId(), me.getClass().getSuperclass(), arg.getClass(), fieldName, redisson); if (arg != null) { if (rObject instanceof Collection) { Collection c = (Collection) rObject; diff --git a/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java b/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java index 412f1c683..a20f2061a 100644 --- a/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java +++ b/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java @@ -16,7 +16,11 @@ package org.redisson.liveobject.core; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; import java.util.Deque; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -32,21 +36,29 @@ import org.redisson.RedissonBlockingDeque; import org.redisson.RedissonBlockingQueue; import org.redisson.RedissonDeque; import org.redisson.RedissonList; +import org.redisson.RedissonLiveObjectService; import org.redisson.RedissonMap; import org.redisson.RedissonQueue; import org.redisson.RedissonReference; import org.redisson.RedissonSet; import org.redisson.RedissonSortedSet; +import org.redisson.api.RLiveObject; import org.redisson.api.RMap; import org.redisson.api.RObject; +import org.redisson.api.RObjectReactive; +import org.redisson.api.RObjectRx; import org.redisson.api.RedissonClient; +import org.redisson.api.RedissonReactiveClient; +import org.redisson.api.RedissonRxClient; import org.redisson.api.annotation.REntity; +import org.redisson.api.annotation.RId; import org.redisson.api.annotation.RObjectField; import org.redisson.client.codec.Codec; import org.redisson.codec.ReferenceCodecProvider; +import org.redisson.config.Config; import org.redisson.liveobject.misc.ClassUtils; +import org.redisson.liveobject.misc.Introspectior; import org.redisson.liveobject.resolver.NamingScheme; -import org.redisson.misc.RedissonObjectFactory; import io.netty.util.internal.PlatformDependent; @@ -73,13 +85,31 @@ public class RedissonObjectBuilder { supportedClassMapping.put(List.class, RedissonList.class); } - private final RedissonClient redisson; + private final Config config; private final ReferenceCodecProvider codecProvider; - public RedissonObjectBuilder(RedissonClient redisson) { + public static class CodecMethodRef { + + Method defaultCodecMethod; + Method customCodecMethod; + + Method get(boolean value) { + if (value) { + return defaultCodecMethod; + } + return customCodecMethod; + } + } + + private static final Map, CodecMethodRef> references = new HashMap, CodecMethodRef>(); + + public RedissonObjectBuilder(Config config) { super(); - this.redisson = redisson; - this.codecProvider = redisson.getConfig().getReferenceCodecProvider(); + this.config = config; + this.codecProvider = config.getReferenceCodecProvider(); + fillCodecMethods(references, RedissonClient.class, RObject.class); + fillCodecMethods(references, RedissonReactiveClient.class, RObjectReactive.class); + fillCodecMethods(references, RedissonRxClient.class, RObjectRx.class); } public void store(RObject ar, String fieldName, RMap liveMap) { @@ -91,23 +121,15 @@ public class RedissonObjectBuilder { new RedissonReference(ar.getClass(), ar.getName(), codec)); } - public RObject createObject(Object id, Class clazz, Class fieldType, String fieldName) { + public RObject createObject(Object id, Class clazz, Class fieldType, String fieldName, RedissonClient redisson) { Class mappedClass = getMappedClass(fieldType); try { if (mappedClass != null) { Codec fieldCodec = getFieldCodec(clazz, mappedClass, fieldName); NamingScheme fieldNamingScheme = getFieldNamingScheme(clazz, fieldName, fieldCodec); + String referenceName = fieldNamingScheme.getFieldReferenceName(clazz, id, mappedClass, fieldName, null); - RObject obj = RedissonObjectFactory - .createRObject(redisson, - mappedClass, - fieldNamingScheme.getFieldReferenceName(clazz, - id, - mappedClass, - fieldName, - null), - fieldCodec); - return obj; + return createRObject(redisson, mappedClass, referenceName, fieldCodec); } } catch (Exception e) { throw new IllegalArgumentException(e); @@ -122,10 +144,10 @@ public class RedissonObjectBuilder { Field field = ClassUtils.getDeclaredField(rEntity, fieldName); if (field.isAnnotationPresent(RObjectField.class)) { RObjectField anno = field.getAnnotation(RObjectField.class); - return codecProvider.getCodec(anno, rEntity, rObjectClass, fieldName, redisson.getConfig()); + return codecProvider.getCodec(anno, rEntity, rObjectClass, fieldName, config); } else { REntity anno = ClassUtils.getAnnotation(rEntity, REntity.class); - return codecProvider.getCodec(anno, (Class) rEntity, redisson.getConfig()); + return codecProvider.getCodec(anno, (Class) rEntity, config); } } @@ -151,4 +173,141 @@ public class RedissonObjectBuilder { return null; } + private void fillCodecMethods(Map, CodecMethodRef> b, Class clientClazz, Class objectClazz) { + for (Method method : clientClazz.getDeclaredMethods()) { + if (!method.getReturnType().equals(Void.TYPE) + && objectClazz.isAssignableFrom(method.getReturnType()) + && method.getName().startsWith("get")) { + Class cls = method.getReturnType(); + if (!b.containsKey(cls)) { + b.put(cls, new CodecMethodRef()); + } + CodecMethodRef builder = b.get(cls); + if (method.getParameterTypes().length == 2 //first param is name, second param is codec. + && Codec.class.isAssignableFrom(method.getParameterTypes()[1])) { + builder.customCodecMethod = method; + } else if (method.getParameterTypes().length == 1) { + builder.defaultCodecMethod = method; + } + } + } + } + + public Object fromReference(RedissonClient redisson, RedissonReference rr) throws Exception { + Class type = rr.getType(); + ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); + if (type != null) { + if (ClassUtils.isAnnotationPresent(type, REntity.class)) { + RedissonLiveObjectService liveObjectService = (RedissonLiveObjectService) redisson.getLiveObjectService(); + REntity anno = ClassUtils.getAnnotation(type, REntity.class); + NamingScheme ns = anno.namingScheme() + .getDeclaredConstructor(Codec.class) + .newInstance(codecProvider.getCodec(anno, type, redisson.getConfig())); + Object id = ns.resolveId(rr.getKeyName()); + return liveObjectService.createLiveObject(type, id); + } + } + + return getObject(redisson, rr, type, codecProvider); + } + + private Object getObject(Object redisson, RedissonReference rr, Class type, + ReferenceCodecProvider codecProvider) + throws IllegalAccessException, InvocationTargetException, Exception, ClassNotFoundException { + if (type != null) { + CodecMethodRef b = references.get(type); + if (b == null && type.getInterfaces().length > 0) { + type = type.getInterfaces()[0]; + } + b = references.get(type); + if (b != null) { + Method builder = b.get(isDefaultCodec(rr)); + return (isDefaultCodec(rr) + ? builder.invoke(redisson, rr.getKeyName()) + : builder.invoke(redisson, rr.getKeyName(), codecProvider.getCodec(rr.getCodecType()))); + } + } + throw new ClassNotFoundException("No RObject is found to match class type of " + rr.getTypeName() + " with codec type of " + rr.getCodecName()); + } + + private boolean isDefaultCodec(RedissonReference rr) { + return rr.getCodec() == null; + } + + public Object fromReference(RedissonRxClient redisson, RedissonReference rr) throws Exception { + Class type = rr.getReactiveType(); + ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); + /** + * Live Object from reference in reactive client is not supported yet. + */ + return getObject(redisson, rr, type, codecProvider); + } + + public Object fromReference(RedissonReactiveClient redisson, RedissonReference rr) throws Exception { + Class type = rr.getReactiveType(); + ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); + /** + * Live Object from reference in reactive client is not supported yet. + */ + return getObject(redisson, rr, type, codecProvider); + } + + public RedissonReference toReference(Object object) { + if (object != null && ClassUtils.isAnnotationPresent(object.getClass(), REntity.class)) { + throw new IllegalArgumentException("REntity should be attached to Redisson before save"); + } + + if (object instanceof RObject && !(object instanceof RLiveObject)) { + Class clazz = object.getClass().getInterfaces()[0]; + + RObject rObject = ((RObject) object); + if (rObject.getCodec() != null) { + config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + } + return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); + } + if (object instanceof RObjectReactive && !(object instanceof RLiveObject)) { + Class clazz = object.getClass().getInterfaces()[0]; + + RObjectReactive rObject = ((RObjectReactive) object); + if (rObject.getCodec() != null) { + config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + } + return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); + } + + try { + if (object instanceof RLiveObject) { + Class rEntity = object.getClass().getSuperclass(); + REntity anno = ClassUtils.getAnnotation(rEntity, REntity.class); + NamingScheme ns = anno.namingScheme() + .getDeclaredConstructor(Codec.class) + .newInstance(config.getReferenceCodecProvider().getCodec(anno, (Class) rEntity, config)); + String name = Introspectior + .getFieldsWithAnnotation(rEntity, RId.class) + .getOnly().getName(); + Class type = ClassUtils.getDeclaredField(rEntity, name).getType(); + + return new RedissonReference(rEntity, + ns.getName(rEntity, type, name, ((RLiveObject) object).getLiveObjectId())); + } + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + return null; + } + + public T createRObject(RedissonClient redisson, Class expectedType, String name, K codec) throws Exception { + List> interfaces = Arrays.asList(expectedType.getInterfaces()); + for (Class iType : interfaces) { + if (references.containsKey(iType)) {// user cache to speed up things a little. + Method builder = references.get(iType).get(codec != null); + return (T) (codec != null + ? builder.invoke(redisson, name) + : builder.invoke(redisson, name, codec)); + } + } + throw new ClassNotFoundException("No RObject is found to match class type of " + (expectedType != null ? expectedType.getName() : "null") + " with codec type of " + (codec != null ? codec.getClass().getName() : "null")); + } + } diff --git a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java b/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java deleted file mode 100644 index dc4c6e167..000000000 --- a/redisson/src/main/java/org/redisson/misc/RedissonObjectFactory.java +++ /dev/null @@ -1,210 +0,0 @@ -/** - * Copyright 2018 Nikita Koksharov - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.redisson.misc; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.redisson.RedissonLiveObjectService; -import org.redisson.RedissonReference; -import org.redisson.api.RLiveObject; -import org.redisson.api.RObject; -import org.redisson.api.RObjectReactive; -import org.redisson.api.RedissonClient; -import org.redisson.api.RedissonReactiveClient; -import org.redisson.api.RedissonRxClient; -import org.redisson.api.annotation.REntity; -import org.redisson.api.annotation.RId; -import org.redisson.client.codec.Codec; -import org.redisson.codec.ReferenceCodecProvider; -import org.redisson.config.Config; -import org.redisson.liveobject.misc.ClassUtils; -import org.redisson.liveobject.misc.Introspectior; -import org.redisson.liveobject.resolver.NamingScheme; - -/** - * - * @author Rui Gu (https://github.com/jackygurui) - */ -public class RedissonObjectFactory { - - public static class CodecMethodRef { - - Method defaultCodecMethod; - Method customCodecMethod; - - Method get(boolean value) { - if (value) { - return defaultCodecMethod; - } - return customCodecMethod; - } - } - - private static final Map, CodecMethodRef> references; - - static { - HashMap, CodecMethodRef> b = new HashMap, CodecMethodRef>(); - fillCodecMethods(b, RedissonClient.class, RObject.class); - fillCodecMethods(b, RedissonReactiveClient.class, RObjectReactive.class); - - references = Collections.unmodifiableMap(b); - } - - private static void fillCodecMethods(HashMap, CodecMethodRef> b, Class clientClazz, Class objectClazz) { - for (Method method : clientClazz.getDeclaredMethods()) { - if (!method.getReturnType().equals(Void.TYPE) - && objectClazz.isAssignableFrom(method.getReturnType()) - && method.getName().startsWith("get")) { - Class cls = method.getReturnType(); - if (!b.containsKey(cls)) { - b.put(cls, new CodecMethodRef()); - } - CodecMethodRef builder = b.get(cls); - if (method.getParameterTypes().length == 2 //first param is name, second param is codec. - && Codec.class.isAssignableFrom(method.getParameterTypes()[1])) { - builder.customCodecMethod = method; - } else if (method.getParameterTypes().length == 1) { - builder.defaultCodecMethod = method; - } - } - } - } - - public static Object fromReference(RedissonClient redisson, RedissonReference rr) throws Exception { - Class type = rr.getType(); - ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); - if (type != null) { - if (ClassUtils.isAnnotationPresent(type, REntity.class)) { - RedissonLiveObjectService liveObjectService = (RedissonLiveObjectService) redisson.getLiveObjectService(); - REntity anno = ClassUtils.getAnnotation(type, REntity.class); - NamingScheme ns = anno.namingScheme() - .getDeclaredConstructor(Codec.class) - .newInstance(codecProvider.getCodec(anno, type, redisson.getConfig())); - Object id = ns.resolveId(rr.getKeyName()); - return liveObjectService.createLiveObject(type, id); - } - } - - return getObject(redisson, rr, type, codecProvider); - } - - private static Object getObject(Object redisson, RedissonReference rr, Class type, - ReferenceCodecProvider codecProvider) - throws IllegalAccessException, InvocationTargetException, Exception, ClassNotFoundException { - if (type != null) { - CodecMethodRef b = references.get(type); - if (b == null && type.getInterfaces().length > 0) { - type = type.getInterfaces()[0]; - } - b = references.get(type); - if (b != null) { - Method builder = b.get(isDefaultCodec(rr)); - return (isDefaultCodec(rr) - ? builder.invoke(redisson, rr.getKeyName()) - : builder.invoke(redisson, rr.getKeyName(), codecProvider.getCodec(rr.getCodecType()))); - } - } - throw new ClassNotFoundException("No RObject is found to match class type of " + rr.getTypeName() + " with codec type of " + rr.getCodecName()); - } - - private static boolean isDefaultCodec(RedissonReference rr) { - return rr.getCodec() == null; - } - - public static Object fromReference(RedissonRxClient redisson, RedissonReference rr) throws Exception { - Class type = rr.getReactiveType(); - ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); - /** - * Live Object from reference in reactive client is not supported yet. - */ - return getObject(redisson, rr, type, codecProvider); - } - - public static Object fromReference(RedissonReactiveClient redisson, RedissonReference rr) throws Exception { - Class type = rr.getReactiveType(); - ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); - /** - * Live Object from reference in reactive client is not supported yet. - */ - return getObject(redisson, rr, type, codecProvider); - } - - public static RedissonReference toReference(Config config, Object object) { - if (object != null && ClassUtils.isAnnotationPresent(object.getClass(), REntity.class)) { - throw new IllegalArgumentException("REntity should be attached to Redisson before save"); - } - - if (object instanceof RObject && !(object instanceof RLiveObject)) { - Class clazz = object.getClass().getInterfaces()[0]; - - RObject rObject = ((RObject) object); - if (rObject.getCodec() != null) { - config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); - } - return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); - } - if (object instanceof RObjectReactive && !(object instanceof RLiveObject)) { - Class clazz = object.getClass().getInterfaces()[0]; - - RObjectReactive rObject = ((RObjectReactive) object); - if (rObject.getCodec() != null) { - config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); - } - return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); - } - - try { - if (object instanceof RLiveObject) { - Class rEntity = object.getClass().getSuperclass(); - REntity anno = ClassUtils.getAnnotation(rEntity, REntity.class); - NamingScheme ns = anno.namingScheme() - .getDeclaredConstructor(Codec.class) - .newInstance(config.getReferenceCodecProvider().getCodec(anno, (Class) rEntity, config)); - String name = Introspectior - .getFieldsWithAnnotation(rEntity, RId.class) - .getOnly().getName(); - Class type = ClassUtils.getDeclaredField(rEntity, name).getType(); - - return new RedissonReference(rEntity, - ns.getName(rEntity, type, name, ((RLiveObject) object).getLiveObjectId())); - } - } catch (Exception e) { - throw new IllegalArgumentException(e); - } - return null; - } - - public static T createRObject(RedissonClient redisson, Class expectedType, String name, K codec) throws Exception { - List> interfaces = Arrays.asList(expectedType.getInterfaces()); - for (Class iType : interfaces) { - if (references.containsKey(iType)) {// user cache to speed up things a little. - Method builder = references.get(iType).get(codec != null); - return (T) (codec != null - ? builder.invoke(redisson, name) - : builder.invoke(redisson, name, codec)); - } - } - throw new ClassNotFoundException("No RObject is found to match class type of " + (expectedType != null ? expectedType.getName() : "null") + " with codec type of " + (codec != null ? codec.getClass().getName() : "null")); - } - - public static void warmUp() {} -} From ceda83ae58e70da5ddc8874ed6e96da6acb2e7aa Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 28 Dec 2018 19:00:41 +0300 Subject: [PATCH 16/21] refactoring --- .../redisson/RedissonLiveObjectService.java | 2 +- .../java/org/redisson/RedissonReactive.java | 8 ------ .../main/java/org/redisson/RedissonRx.java | 8 ------ .../redisson/api/RedissonReactiveClient.java | 8 ------ .../org/redisson/api/RedissonRxClient.java | 8 ------ .../redisson/command/CommandAsyncService.java | 4 +-- .../main/java/org/redisson/config/Config.java | 28 ------------------- .../liveobject/core/AccessorInterceptor.java | 2 +- .../core/LiveObjectInterceptor.java | 4 +-- .../core/RedissonObjectBuilder.java | 18 ++++++------ .../support/SpringNamespaceWikiTest.java | 2 -- 11 files changed, 16 insertions(+), 76 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java b/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java index 3f6773312..10999523b 100644 --- a/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java +++ b/redisson/src/main/java/org/redisson/RedissonLiveObjectService.java @@ -653,7 +653,7 @@ public class RedissonLiveObjectService implements RLiveObjectService { .install(LiveObjectInterceptor.Getter.class, LiveObjectInterceptor.Setter.class)) .to(new LiveObjectInterceptor(redisson, entityClass, - getRIdFieldName(entityClass)))) + getRIdFieldName(entityClass), commandExecutor.getObjectBuilder()))) // .intercept(MethodDelegation.to( // new LiveObjectInterceptor(redisson, codecProvider, entityClass, // getRIdFieldName(entityClass))) diff --git a/redisson/src/main/java/org/redisson/RedissonReactive.java b/redisson/src/main/java/org/redisson/RedissonReactive.java index 59209e291..a6e0e01b4 100644 --- a/redisson/src/main/java/org/redisson/RedissonReactive.java +++ b/redisson/src/main/java/org/redisson/RedissonReactive.java @@ -60,7 +60,6 @@ import org.redisson.api.RTransactionReactive; import org.redisson.api.RedissonReactiveClient; import org.redisson.api.TransactionOptions; import org.redisson.client.codec.Codec; -import org.redisson.codec.ReferenceCodecProvider; import org.redisson.config.Config; import org.redisson.config.ConfigSupport; import org.redisson.connection.ConnectionManager; @@ -95,7 +94,6 @@ public class RedissonReactive implements RedissonReactiveClient { protected final CommandReactiveService commandExecutor; protected final ConnectionManager connectionManager; protected final Config config; - protected final ReferenceCodecProvider codecProvider; protected final SemaphorePubSub semaphorePubSub = new SemaphorePubSub(); @@ -106,7 +104,6 @@ public class RedissonReactive implements RedissonReactiveClient { connectionManager = ConfigSupport.createConnectionManager(configCopy); commandExecutor = new CommandReactiveService(connectionManager); evictionScheduler = new EvictionScheduler(commandExecutor); - codecProvider = config.getReferenceCodecProvider(); } public EvictionScheduler getEvictionScheduler() { @@ -428,11 +425,6 @@ public class RedissonReactive implements RedissonReactiveClient { return config; } - @Override - public ReferenceCodecProvider getCodecProvider() { - return codecProvider; - } - @Override public NodesGroup getNodesGroup() { return new RedisNodes(connectionManager); diff --git a/redisson/src/main/java/org/redisson/RedissonRx.java b/redisson/src/main/java/org/redisson/RedissonRx.java index 49e73df7d..2d7740b7f 100644 --- a/redisson/src/main/java/org/redisson/RedissonRx.java +++ b/redisson/src/main/java/org/redisson/RedissonRx.java @@ -56,7 +56,6 @@ import org.redisson.api.RTransactionRx; import org.redisson.api.RedissonRxClient; import org.redisson.api.TransactionOptions; import org.redisson.client.codec.Codec; -import org.redisson.codec.ReferenceCodecProvider; import org.redisson.config.Config; import org.redisson.config.ConfigSupport; import org.redisson.connection.ConnectionManager; @@ -95,7 +94,6 @@ public class RedissonRx implements RedissonRxClient { protected final CommandRxExecutor commandExecutor; protected final ConnectionManager connectionManager; protected final Config config; - protected final ReferenceCodecProvider codecProvider; protected final SemaphorePubSub semaphorePubSub = new SemaphorePubSub(); @@ -106,7 +104,6 @@ public class RedissonRx implements RedissonRxClient { connectionManager = ConfigSupport.createConnectionManager(configCopy); commandExecutor = new CommandRxService(connectionManager); evictionScheduler = new EvictionScheduler(commandExecutor); - codecProvider = config.getReferenceCodecProvider(); } @Override @@ -404,11 +401,6 @@ public class RedissonRx implements RedissonRxClient { return config; } - @Override - public ReferenceCodecProvider getCodecProvider() { - return codecProvider; - } - @Override public NodesGroup getNodesGroup() { return new RedisNodes(connectionManager); diff --git a/redisson/src/main/java/org/redisson/api/RedissonReactiveClient.java b/redisson/src/main/java/org/redisson/api/RedissonReactiveClient.java index 1f832edbf..033ede1f4 100644 --- a/redisson/src/main/java/org/redisson/api/RedissonReactiveClient.java +++ b/redisson/src/main/java/org/redisson/api/RedissonReactiveClient.java @@ -18,7 +18,6 @@ package org.redisson.api; import java.util.List; import org.redisson.client.codec.Codec; -import org.redisson.codec.ReferenceCodecProvider; import org.redisson.config.Config; /** @@ -636,13 +635,6 @@ public interface RedissonReactiveClient { */ Config getConfig(); - /** - * Returns the CodecProvider instance - * - * @return CodecProvider object - */ - ReferenceCodecProvider getCodecProvider(); - /** * Get Redis nodes group for server operations * diff --git a/redisson/src/main/java/org/redisson/api/RedissonRxClient.java b/redisson/src/main/java/org/redisson/api/RedissonRxClient.java index 1ff32c478..535073294 100644 --- a/redisson/src/main/java/org/redisson/api/RedissonRxClient.java +++ b/redisson/src/main/java/org/redisson/api/RedissonRxClient.java @@ -16,7 +16,6 @@ package org.redisson.api; import org.redisson.client.codec.Codec; -import org.redisson.codec.ReferenceCodecProvider; import org.redisson.config.Config; /** @@ -618,13 +617,6 @@ public interface RedissonRxClient { */ Config getConfig(); - /** - * Returns the CodecProvider instance - * - * @return CodecProvider object - */ - ReferenceCodecProvider getCodecProvider(); - /** * Get Redis nodes group for server operations * diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index 816ecc2c6..4edf2e9b7 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -142,9 +142,9 @@ public class CommandAsyncService implements CommandAsyncExecutor { private void enableRedissonReferenceSupport(Config config) { Codec codec = config.getCodec(); - ReferenceCodecProvider codecProvider = config.getReferenceCodecProvider(); - codecProvider.registerCodec((Class) codec.getClass(), codec); objectBuilder = new RedissonObjectBuilder(config); + ReferenceCodecProvider codecProvider = objectBuilder.getReferenceCodecProvider(); + codecProvider.registerCodec((Class) codec.getClass(), codec); } @Override diff --git a/redisson/src/main/java/org/redisson/config/Config.java b/redisson/src/main/java/org/redisson/config/Config.java index 77c038f48..81627fbf4 100644 --- a/redisson/src/main/java/org/redisson/config/Config.java +++ b/redisson/src/main/java/org/redisson/config/Config.java @@ -66,11 +66,6 @@ public class Config { */ private Codec codec; - /** - * For codec registry and look up. DefaultCodecProvider used by default - */ - private ReferenceCodecProvider referenceCodecProvider = new DefaultReferenceCodecProvider(); - private ExecutorService executor; /** @@ -115,7 +110,6 @@ public class Config { setNettyThreads(oldConf.getNettyThreads()); setThreads(oldConf.getThreads()); setCodec(oldConf.getCodec()); - setReferenceCodecProvider(oldConf.getReferenceCodecProvider()); setReferenceEnabled(oldConf.isReferenceEnabled()); setEventLoopGroup(oldConf.getEventLoopGroup()); setTransportMode(oldConf.getTransportMode()); @@ -159,28 +153,6 @@ public class Config { return codec; } - /** - * Reference objects codec provider used for codec registry and look up. - * org.redisson.codec.DefaultReferenceCodecProvider used by default. - * - * @param codecProvider object - * @return config - * @see org.redisson.codec.ReferenceCodecProvider - */ - public Config setReferenceCodecProvider(ReferenceCodecProvider codecProvider) { - this.referenceCodecProvider = codecProvider; - return this; - } - - /** - * Returns the CodecProvider instance - * - * @return CodecProvider - */ - public ReferenceCodecProvider getReferenceCodecProvider() { - return referenceCodecProvider; - } - /** * Config option indicate whether Redisson Reference feature is enabled. *

diff --git a/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java b/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java index d8efd3c37..1cbf585bb 100644 --- a/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java +++ b/redisson/src/main/java/org/redisson/liveobject/core/AccessorInterceptor.java @@ -104,7 +104,7 @@ public class AccessorInterceptor { Class rEntity = liveObject.getClass().getSuperclass(); REntity anno = ClassUtils.getAnnotation(rEntity, REntity.class); - Codec codec = redisson.getConfig().getReferenceCodecProvider().getCodec(anno, rEntity, redisson.getConfig()); + Codec codec = objectBuilder.getReferenceCodecProvider().getCodec(anno, rEntity, redisson.getConfig()); NamingScheme ns = anno.namingScheme() .getDeclaredConstructor(Codec.class) .newInstance(codec); diff --git a/redisson/src/main/java/org/redisson/liveobject/core/LiveObjectInterceptor.java b/redisson/src/main/java/org/redisson/liveobject/core/LiveObjectInterceptor.java index a03fa57dd..9d6c19db0 100644 --- a/redisson/src/main/java/org/redisson/liveobject/core/LiveObjectInterceptor.java +++ b/redisson/src/main/java/org/redisson/liveobject/core/LiveObjectInterceptor.java @@ -57,9 +57,9 @@ public class LiveObjectInterceptor { private final NamingScheme namingScheme; private Codec codec; - public LiveObjectInterceptor(RedissonClient redisson, Class entityClass, String idFieldName) { + public LiveObjectInterceptor(RedissonClient redisson, Class entityClass, String idFieldName, RedissonObjectBuilder objectBuilder) { this.redisson = redisson; - this.codecProvider = redisson.getConfig().getReferenceCodecProvider(); + this.codecProvider = objectBuilder.getReferenceCodecProvider(); this.originalClass = entityClass; this.idFieldName = idFieldName; diff --git a/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java b/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java index a20f2061a..530be0776 100644 --- a/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java +++ b/redisson/src/main/java/org/redisson/liveobject/core/RedissonObjectBuilder.java @@ -54,6 +54,7 @@ import org.redisson.api.annotation.REntity; import org.redisson.api.annotation.RId; import org.redisson.api.annotation.RObjectField; import org.redisson.client.codec.Codec; +import org.redisson.codec.DefaultReferenceCodecProvider; import org.redisson.codec.ReferenceCodecProvider; import org.redisson.config.Config; import org.redisson.liveobject.misc.ClassUtils; @@ -86,7 +87,6 @@ public class RedissonObjectBuilder { } private final Config config; - private final ReferenceCodecProvider codecProvider; public static class CodecMethodRef { @@ -103,15 +103,20 @@ public class RedissonObjectBuilder { private static final Map, CodecMethodRef> references = new HashMap, CodecMethodRef>(); + private final ReferenceCodecProvider codecProvider = new DefaultReferenceCodecProvider(); + public RedissonObjectBuilder(Config config) { super(); this.config = config; - this.codecProvider = config.getReferenceCodecProvider(); fillCodecMethods(references, RedissonClient.class, RObject.class); fillCodecMethods(references, RedissonReactiveClient.class, RObjectReactive.class); fillCodecMethods(references, RedissonRxClient.class, RObjectRx.class); } + public ReferenceCodecProvider getReferenceCodecProvider() { + return codecProvider; + } + public void store(RObject ar, String fieldName, RMap liveMap) { Codec codec = ar.getCodec(); if (codec != null) { @@ -195,7 +200,6 @@ public class RedissonObjectBuilder { public Object fromReference(RedissonClient redisson, RedissonReference rr) throws Exception { Class type = rr.getType(); - ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); if (type != null) { if (ClassUtils.isAnnotationPresent(type, REntity.class)) { RedissonLiveObjectService liveObjectService = (RedissonLiveObjectService) redisson.getLiveObjectService(); @@ -236,7 +240,6 @@ public class RedissonObjectBuilder { public Object fromReference(RedissonRxClient redisson, RedissonReference rr) throws Exception { Class type = rr.getReactiveType(); - ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); /** * Live Object from reference in reactive client is not supported yet. */ @@ -245,7 +248,6 @@ public class RedissonObjectBuilder { public Object fromReference(RedissonReactiveClient redisson, RedissonReference rr) throws Exception { Class type = rr.getReactiveType(); - ReferenceCodecProvider codecProvider = redisson.getConfig().getReferenceCodecProvider(); /** * Live Object from reference in reactive client is not supported yet. */ @@ -262,7 +264,7 @@ public class RedissonObjectBuilder { RObject rObject = ((RObject) object); if (rObject.getCodec() != null) { - config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + codecProvider.registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); } return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); } @@ -271,7 +273,7 @@ public class RedissonObjectBuilder { RObjectReactive rObject = ((RObjectReactive) object); if (rObject.getCodec() != null) { - config.getReferenceCodecProvider().registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); + codecProvider.registerCodec((Class) rObject.getCodec().getClass(), rObject.getCodec()); } return new RedissonReference(clazz, rObject.getName(), rObject.getCodec()); } @@ -282,7 +284,7 @@ public class RedissonObjectBuilder { REntity anno = ClassUtils.getAnnotation(rEntity, REntity.class); NamingScheme ns = anno.namingScheme() .getDeclaredConstructor(Codec.class) - .newInstance(config.getReferenceCodecProvider().getCodec(anno, (Class) rEntity, config)); + .newInstance(codecProvider.getCodec(anno, (Class) rEntity, config)); String name = Introspectior .getFieldsWithAnnotation(rEntity, RId.class) .getOnly().getName(); diff --git a/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java index 2734ebd7b..48faf6563 100644 --- a/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java +++ b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java @@ -19,7 +19,6 @@ import org.redisson.client.RedisClient; import org.redisson.client.RedisConnection; import org.redisson.client.codec.Codec; import org.redisson.client.protocol.RedisCommands; -import org.redisson.codec.ReferenceCodecProvider; import org.redisson.config.Config; import org.redisson.config.SingleServerConfig; import org.springframework.context.ConfigurableApplicationContext; @@ -122,7 +121,6 @@ public class SpringNamespaceWikiTest { assertEquals(2, config.getNettyThreads()); assertSame(context.getBean("myCodec", Codec.class), config.getCodec()); assertEquals(false, config.isReferenceEnabled()); - assertSame(context.getBean("myCodecProvider", ReferenceCodecProvider.class), config.getReferenceCodecProvider()); assertSame(context.getBean("myExecutor", Executor.class), config.getExecutor()); assertSame(context.getBean("myEventLoopGroup", EventLoopGroup.class), config.getEventLoopGroup()); Method method = Config.class.getDeclaredMethod("getSingleServerConfig", (Class[]) null); From d6448eee3431539bfa9d5b6a53410ba55284f63f Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 4 Jan 2019 19:21:02 +0300 Subject: [PATCH 17/21] Fixed - LRUCacheMap throws ArrayIndexOutOfBoundsException. #1836 --- redisson/src/main/java/org/redisson/cache/LRUCacheMap.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java b/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java index c8fdc529e..55b3bd007 100644 --- a/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java +++ b/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java @@ -15,13 +15,13 @@ */ package org.redisson.cache; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicLong; /** @@ -36,7 +36,7 @@ public class LRUCacheMap extends AbstractCacheMap { private final AtomicLong index = new AtomicLong(); private final List>> queues = - new ArrayList>>(Runtime.getRuntime().availableProcessors()*2); + new CopyOnWriteArrayList>>(); public LRUCacheMap(int size, long timeToLiveInMillis, long maxIdleInMillis) { super(size, timeToLiveInMillis, maxIdleInMillis); From ff16c2bcfd96919693e68f19e3db4f8965b12681 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Sat, 5 Jan 2019 09:49:07 +0300 Subject: [PATCH 18/21] Fixed - LRUCacheMap throws ArrayIndexOutOfBoundsException. #1836 --- redisson/src/main/java/org/redisson/cache/LRUCacheMap.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java b/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java index 55b3bd007..b9a5db5a9 100644 --- a/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java +++ b/redisson/src/main/java/org/redisson/cache/LRUCacheMap.java @@ -15,6 +15,7 @@ */ package org.redisson.cache; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -36,7 +37,7 @@ public class LRUCacheMap extends AbstractCacheMap { private final AtomicLong index = new AtomicLong(); private final List>> queues = - new CopyOnWriteArrayList>>(); + new ArrayList>>(); public LRUCacheMap(int size, long timeToLiveInMillis, long maxIdleInMillis) { super(size, timeToLiveInMillis, maxIdleInMillis); @@ -54,7 +55,7 @@ public class LRUCacheMap extends AbstractCacheMap { } private Collection> getQueue(CachedValue value) { - return queues.get(value.hashCode() % queues.size()); + return queues.get(Math.abs(value.hashCode() % queues.size())); } @Override From 820fe3b68eb2cc963f0ec5201046818a2b78a8fa Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Sun, 6 Jan 2019 16:41:52 +0300 Subject: [PATCH 19/21] Fixed - RGeo.pos throws ClassCastException #1837 --- .../main/java/org/redisson/RedissonGeo.java | 56 ++++++++----------- .../client/handler/CommandDecoder.java | 4 ++ .../org/redisson/client/handler/State.java | 8 +++ .../protocol/decoder/ListMultiDecoder.java | 19 ++++++- .../java/org/redisson/RedissonGeoTest.java | 38 +++++++++++++ 5 files changed, 90 insertions(+), 35 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonGeo.java b/redisson/src/main/java/org/redisson/RedissonGeo.java index 8b8afe814..eebaedd13 100644 --- a/redisson/src/main/java/org/redisson/RedissonGeo.java +++ b/redisson/src/main/java/org/redisson/RedissonGeo.java @@ -55,6 +55,10 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> postitionDecoder = new ListMultiDecoder(new CodecDecoder(), new GeoPositionDecoder(), new ObjectListReplayDecoder(ListMultiDecoder.RESET), new GeoMapReplayDecoder()); private static final MultiDecoder> distanceDecoder = new ListMultiDecoder(new GeoDistanceDecoder(), new GeoMapReplayDecoder()); + private static final RedisCommand> GEORADIUS_RO_DISTANCE = new RedisCommand>("GEORADIUS_RO", distanceDecoder); + private static final RedisCommand> GEORADIUS_RO_POS = new RedisCommand>("GEORADIUS_RO", postitionDecoder); + private static final RedisCommand> GEORADIUSBYMEMBER_RO_DISTANCE = new RedisCommand>("GEORADIUSBYMEMBER_RO", distanceDecoder); + private static final RedisCommand> GEORADIUSBYMEMBER_RO_POS = new RedisCommand>("GEORADIUSBYMEMBER_RO", postitionDecoder); public RedissonGeo(CommandAsyncExecutor connectionManager, String name, RedissonClient redisson) { super(connectionManager, name, redisson); @@ -134,7 +138,9 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> decoder = new ListMultiDecoder(new GeoPositionDecoder(), new ObjectListReplayDecoder(ListMultiDecoder.RESET), new GeoPositionMapDecoder((List)Arrays.asList(members))); + MultiDecoder> decoder = new ListMultiDecoder(0, new GeoPositionDecoder(), +// new ObjectListReplayDecoder(ListMultiDecoder.RESET), + new GeoPositionMapDecoder((List)Arrays.asList(members))); RedisCommand> command = new RedisCommand>("GEOPOS", decoder); return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, command, params.toArray()); } @@ -189,8 +195,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(double longitude, double latitude, double radius, GeoUnit geoUnit) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_DISTANCE, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHDIST"); } @@ -201,8 +206,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(double longitude, double latitude, double radius, GeoUnit geoUnit, int count) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_DISTANCE, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHDIST", "COUNT", count); } @@ -213,8 +217,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(double longitude, double latitude, double radius, GeoUnit geoUnit, GeoOrder geoOrder) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_DISTANCE, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHDIST", geoOrder); } @@ -225,8 +228,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(double longitude, double latitude, double radius, GeoUnit geoUnit, GeoOrder geoOrder, int count) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_DISTANCE, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHDIST", "COUNT", count, geoOrder); } @@ -237,8 +239,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(double longitude, double latitude, double radius, GeoUnit geoUnit) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHCOORD"); + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_POS, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHCOORD"); } @Override @@ -248,8 +249,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(double longitude, double latitude, double radius, GeoUnit geoUnit, int count) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_POS, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHCOORD", "COUNT", count); } @@ -260,8 +260,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(double longitude, double latitude, double radius, GeoUnit geoUnit, GeoOrder geoOrder) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_POS, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHCOORD", geoOrder); } @@ -272,8 +271,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(double longitude, double latitude, double radius, GeoUnit geoUnit, GeoOrder geoOrder, int count) { - RedisCommand> command = new RedisCommand>("GEORADIUS_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), convert(longitude), convert(latitude), + return commandExecutor.readAsync(getName(), codec, GEORADIUS_RO_POS, getName(), convert(longitude), convert(latitude), radius, geoUnit, "WITHCOORD", "COUNT", count, geoOrder); } @@ -324,8 +322,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(V member, double radius, GeoUnit geoUnit) { - RedisCommand command = new RedisCommand("GEORADIUSBYMEMBER_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHDIST"); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_DISTANCE, getName(), encode(member), radius, geoUnit, "WITHDIST"); } @Override @@ -335,8 +332,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(V member, double radius, GeoUnit geoUnit, int count) { - RedisCommand command = new RedisCommand("GEORADIUSBYMEMBER_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHDIST", "COUNT", count); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_DISTANCE, getName(), encode(member), radius, geoUnit, "WITHDIST", "COUNT", count); } @Override @@ -346,8 +342,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(V member, double radius, GeoUnit geoUnit, GeoOrder geoOrder) { - RedisCommand command = new RedisCommand("GEORADIUSBYMEMBER_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHDIST", geoOrder); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_DISTANCE, getName(), encode(member), radius, geoUnit, "WITHDIST", geoOrder); } @Override @@ -357,8 +352,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithDistanceAsync(V member, double radius, GeoUnit geoUnit, GeoOrder geoOrder, int count) { - RedisCommand command = new RedisCommand("GEORADIUSBYMEMBER_RO", distanceDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHDIST", "COUNT", count, geoOrder); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_DISTANCE, getName(), encode(member), radius, geoUnit, "WITHDIST", "COUNT", count, geoOrder); } @Override @@ -368,8 +362,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(V member, double radius, GeoUnit geoUnit) { - RedisCommand> command = new RedisCommand>("GEORADIUSBYMEMBER_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHCOORD"); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_POS, getName(), encode(member), radius, geoUnit, "WITHCOORD"); } @Override @@ -379,8 +372,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(V member, double radius, GeoUnit geoUnit, int count) { - RedisCommand> command = new RedisCommand>("GEORADIUSBYMEMBER_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHCOORD", "COUNT", count); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_POS, getName(), encode(member), radius, geoUnit, "WITHCOORD", "COUNT", count); } @Override @@ -390,8 +382,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(V member, double radius, GeoUnit geoUnit, GeoOrder geoOrder) { - RedisCommand> command = new RedisCommand>("GEORADIUSBYMEMBER_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHCOORD", geoOrder); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_POS, getName(), encode(member), radius, geoUnit, "WITHCOORD", geoOrder); } @Override @@ -401,8 +392,7 @@ public class RedissonGeo extends RedissonScoredSortedSet implements RGeo> radiusWithPositionAsync(V member, double radius, GeoUnit geoUnit, GeoOrder geoOrder, int count) { - RedisCommand> command = new RedisCommand>("GEORADIUSBYMEMBER_RO", postitionDecoder); - return commandExecutor.readAsync(getName(), codec, command, getName(), encode(member), radius, geoUnit, "WITHCOORD", "COUNT", count, geoOrder); + return commandExecutor.readAsync(getName(), codec, GEORADIUSBYMEMBER_RO_POS, getName(), encode(member), radius, geoUnit, "WITHCOORD", "COUNT", count, geoOrder); } @Override diff --git a/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java b/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java index 9476c189a..b64dab10f 100644 --- a/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java +++ b/redisson/src/main/java/org/redisson/client/handler/CommandDecoder.java @@ -340,8 +340,12 @@ public class CommandDecoder extends ReplayingDecoder { state().addLevel(lastLevel); } + state().incLevel(); + decodeList(in, data, parts, ctx, size, respParts, skipConvertor); + state().decLevel(); + if (state().isMakeCheckpoint()) { if (lastLevel == state().getLastLevel() && lastLevel.isFull()) { state().removeLastLevel(); diff --git a/redisson/src/main/java/org/redisson/client/handler/State.java b/redisson/src/main/java/org/redisson/client/handler/State.java index 57c794666..db6fccc2a 100644 --- a/redisson/src/main/java/org/redisson/client/handler/State.java +++ b/redisson/src/main/java/org/redisson/client/handler/State.java @@ -54,6 +54,14 @@ public class State { return levels.get(level); } + public void incLevel() { + level++; + } + + public void decLevel() { + level--; + } + public void addLevel(StateLevel stateLevel) { if (levels == null) { levels = new ArrayList(2); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java index a3af51352..cec71dc51 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ListMultiDecoder.java @@ -115,12 +115,23 @@ public class ListMultiDecoder implements MultiDecoder { public ListMultiDecoder(MultiDecoder ... decoders) { this.decoders = decoders; } + + private Integer fixedIndex; + + public ListMultiDecoder(Integer fixedIndex, MultiDecoder ... decoders) { + this.fixedIndex = fixedIndex; + this.decoders = decoders; + } @Override public Decoder getDecoder(int paramNum, State state) { if (paramNum == 0) { NestedDecoderState s = getDecoder(state); - s.incIndex(); + if (fixedIndex != null) { + s.setIndex(fixedIndex); + } else { + s.incIndex(); + } s.resetPartsIndex(); } @@ -152,7 +163,11 @@ public class ListMultiDecoder implements MultiDecoder { int index = s.getIndex(); index += s.incPartsIndex(); - if (index == -1) { + if (fixedIndex != null && parts.isEmpty()) { + s.resetPartsIndex(); + } + + if (index == -1 || (fixedIndex != null && state.getLevel() == 0)) { return decoders[decoders.length-1].decode(parts, state); } diff --git a/redisson/src/test/java/org/redisson/RedissonGeoTest.java b/redisson/src/test/java/org/redisson/RedissonGeoTest.java index 69ab4fedf..fa2b2d5e2 100644 --- a/redisson/src/test/java/org/redisson/RedissonGeoTest.java +++ b/redisson/src/test/java/org/redisson/RedissonGeoTest.java @@ -74,8 +74,46 @@ public class RedissonGeoTest extends BaseTest { assertThat(geo.hash("Palermo", "Catania")).isEmpty(); } + + @Test + public void testPos4() { + RGeo geo = redisson.getGeo("test"); + geo.add(new GeoEntry(13.361389, 38.115556, "Palermo"), new GeoEntry(15.087269, 37.502669, "Catania")); + + Map expected = new LinkedHashMap(); + expected.put("Palermo", new GeoPosition(13.361389338970184, 38.115556395496299)); + expected.put("Catania", new GeoPosition(15.087267458438873, 37.50266842333162)); + assertThat(geo.pos("Palermo", "Catania")).isEqualTo(expected); + } + @Test + public void testPos1() { + RGeo geo = redisson.getGeo("test"); + geo.add(0.123,0.893,"hi"); + Map res = geo.pos("hi"); + assertThat(res.get("hi").getLatitude()).isNotNull(); + assertThat(res.get("hi").getLongitude()).isNotNull(); + } + @Test + public void testPos3() { + RGeo geo = redisson.getGeo("test"); + geo.add(0.123,0.893,"hi"); + Map res = geo.pos("hi", "123f", "sdfdsf"); + assertThat(res.get("hi").getLatitude()).isNotNull(); + assertThat(res.get("hi").getLongitude()).isNotNull(); + } + + @Test + public void testPos2() { + RGeo geo = redisson.getGeo("test"); + geo.add(new GeoEntry(13.361389, 38.115556, "Palermo")); + + Map expected = new LinkedHashMap(); + expected.put("Palermo", new GeoPosition(13.361389338970184, 38.115556395496299)); + assertThat(geo.pos("test2", "Palermo", "test3", "Catania", "test1")).isEqualTo(expected); + } + @Test public void testPos() { RGeo geo = redisson.getGeo("test"); From cd49e38f4805dedefdb0ae306ab35f7412b79f2d Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 7 Jan 2019 09:47:35 +0300 Subject: [PATCH 20/21] Fixed - `pollFromAny` doesn't support Redis cluster. #1831 --- .../org/redisson/RedissonBlockingDeque.java | 8 +-- .../org/redisson/RedissonBlockingQueue.java | 10 +--- .../RedissonBoundedBlockingQueue.java | 9 +-- .../org/redisson/RedissonScoredSortedSet.java | 16 +----- .../command/CommandAsyncExecutor.java | 2 + .../redisson/command/CommandAsyncService.java | 56 +++++++++++++++++++ .../redisson/RedissonBlockingQueueTest.java | 47 ++++++++++++++++ 7 files changed, 110 insertions(+), 38 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonBlockingDeque.java b/redisson/src/main/java/org/redisson/RedissonBlockingDeque.java index 707c74be5..ebf8fd7ce 100644 --- a/redisson/src/main/java/org/redisson/RedissonBlockingDeque.java +++ b/redisson/src/main/java/org/redisson/RedissonBlockingDeque.java @@ -233,13 +233,7 @@ public class RedissonBlockingDeque extends RedissonDeque implements RBlock @Override public RFuture pollLastFromAnyAsync(long timeout, TimeUnit unit, String ... queueNames) { - List params = new ArrayList(queueNames.length + 1); - params.add(getName()); - for (Object name : queueNames) { - params.add(name); - } - params.add(toSeconds(timeout, unit)); - return commandExecutor.writeAsync(getName(), codec, RedisCommands.BRPOP_VALUE, params.toArray()); + return commandExecutor.pollFromAnyAsync(getName(), codec, RedisCommands.BRPOP_VALUE, toSeconds(timeout, unit), queueNames); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java b/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java index 9dc4070a3..991398c17 100644 --- a/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java +++ b/redisson/src/main/java/org/redisson/RedissonBlockingQueue.java @@ -15,10 +15,8 @@ */ package org.redisson; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.concurrent.TimeUnit; import org.redisson.api.RBlockingQueue; @@ -111,13 +109,7 @@ public class RedissonBlockingQueue extends RedissonQueue implements RBlock */ @Override public RFuture pollFromAnyAsync(long timeout, TimeUnit unit, String ... queueNames) { - List params = new ArrayList(queueNames.length + 1); - params.add(getName()); - for (Object name : queueNames) { - params.add(name); - } - params.add(toSeconds(timeout, unit)); - return commandExecutor.writeAsync(getName(), codec, RedisCommands.BLPOP_VALUE, params.toArray()); + return commandExecutor.pollFromAnyAsync(getName(), codec, RedisCommands.BLPOP_VALUE, toSeconds(timeout, unit), queueNames); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java b/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java index 01ed0700c..c1b710bc5 100644 --- a/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java +++ b/redisson/src/main/java/org/redisson/RedissonBoundedBlockingQueue.java @@ -15,7 +15,6 @@ */ package org.redisson; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -247,13 +246,7 @@ public class RedissonBoundedBlockingQueue extends RedissonQueue implements */ @Override public RFuture pollFromAnyAsync(long timeout, TimeUnit unit, String ... queueNames) { - List params = new ArrayList(queueNames.length + 1); - params.add(getName()); - for (Object name : queueNames) { - params.add(name); - } - params.add(unit.toSeconds(timeout)); - RFuture takeFuture = commandExecutor.writeAsync(getName(), codec, RedisCommands.BLPOP_VALUE, params.toArray()); + RFuture takeFuture = commandExecutor.pollFromAnyAsync(getName(), codec, RedisCommands.BLPOP_VALUE, toSeconds(timeout, unit), queueNames); return wrapTakeFuture(takeFuture); } diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 0aa341ec5..a8f50bf7f 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -155,13 +155,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture pollFirstFromAnyAsync(long timeout, TimeUnit unit, String ... queueNames) { - List params = new ArrayList(queueNames.length + 1); - params.add(getName()); - for (Object name : queueNames) { - params.add(name); - } - params.add(toSeconds(timeout, unit)); - return commandExecutor.writeAsync(getName(), codec, RedisCommands.BZPOPMIN_VALUE, params.toArray()); + return commandExecutor.pollFromAnyAsync(getName(), codec, RedisCommands.BZPOPMIN_VALUE, toSeconds(timeout, unit), queueNames); } @Override @@ -171,13 +165,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc @Override public RFuture pollLastFromAnyAsync(long timeout, TimeUnit unit, String ... queueNames) { - List params = new ArrayList(queueNames.length + 1); - params.add(getName()); - for (Object name : queueNames) { - params.add(name); - } - params.add(toSeconds(timeout, unit)); - return commandExecutor.writeAsync(getName(), codec, RedisCommands.BZPOPMAX_VALUE, params.toArray()); + return commandExecutor.pollFromAnyAsync(getName(), codec, RedisCommands.BZPOPMAX_VALUE, toSeconds(timeout, unit), queueNames); } @Override diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java b/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java index 67bca00e7..2a8d77b22 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncExecutor.java @@ -112,5 +112,7 @@ public interface CommandAsyncExecutor { RFuture readRandomAsync(Codec codec, RedisCommand command, Object ... params); RFuture readRandomAsync(MasterSlaveEntry entry, Codec codec, RedisCommand command, Object... params); + + RFuture pollFromAnyAsync(String name, Codec codec, RedisCommand command, long secondsTimeout, String ... queueNames); } diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index 4edf2e9b7..d4d334b99 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -28,6 +29,8 @@ import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; import org.redisson.RedissonReference; import org.redisson.RedissonShutdownException; @@ -1233,4 +1236,57 @@ public class CommandAsyncService implements CommandAsyncExecutor { public RedissonObjectBuilder getObjectBuilder() { return objectBuilder; } + + public RFuture pollFromAnyAsync(String name, Codec codec, RedisCommand command, long secondsTimeout, String ... queueNames) { + if (connectionManager.isClusterMode() && queueNames.length > 0) { + RPromise result = new RedissonPromise(); + AtomicReference> ref = new AtomicReference>(); + List names = new ArrayList(); + names.add(name); + names.addAll(Arrays.asList(queueNames)); + ref.set(names.iterator()); + AtomicLong counter = new AtomicLong(secondsTimeout); + poll(name, codec, result, ref, names, counter, command); + return result; + } else { + List params = new ArrayList(queueNames.length + 1); + params.add(name); + for (Object queueName : queueNames) { + params.add(queueName); + } + params.add(secondsTimeout); + return writeAsync(name, codec, command, params.toArray()); + } + } + + private void poll(final String name, final Codec codec, final RPromise result, final AtomicReference> ref, + final List names, final AtomicLong counter, final RedisCommand command) { + if (ref.get().hasNext()) { + String currentName = ref.get().next().toString(); + RFuture future = writeAsync(currentName, codec, command, currentName, 1); + future.addListener(new FutureListener() { + @Override + public void operationComplete(Future future) throws Exception { + if (!future.isSuccess()) { + result.tryFailure(future.cause()); + return; + } + + if (future.getNow() != null) { + result.trySuccess(future.getNow()); + } else { + if (counter.decrementAndGet() == 0) { + result.trySuccess(null); + return; + } + poll(name, codec, result, ref, names, counter, command); + } + } + }); + } else { + ref.set(names.iterator()); + poll(name, codec, result, ref, names, counter, command); + } + } + } diff --git a/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java b/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java index 9247be434..7178c6750 100644 --- a/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java +++ b/redisson/src/test/java/org/redisson/RedissonBlockingQueueTest.java @@ -17,6 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.Assert; import org.junit.Test; +import org.redisson.ClusterRunner.ClusterProcesses; import org.redisson.RedisRunner.RedisProcess; import org.redisson.api.RBlockingQueue; import org.redisson.api.RFuture; @@ -314,6 +315,52 @@ public class RedissonBlockingQueueTest extends RedissonQueueTest { redisson.shutdown(); } + @Test + public void testPollFromAnyInCluster() throws Exception { + RedisRunner master1 = new RedisRunner().port(6890).randomDir().nosave(); + RedisRunner master2 = new RedisRunner().port(6891).randomDir().nosave(); + RedisRunner master3 = new RedisRunner().port(6892).randomDir().nosave(); + RedisRunner slave1 = new RedisRunner().port(6900).randomDir().nosave(); + RedisRunner slave2 = new RedisRunner().port(6901).randomDir().nosave(); + RedisRunner slave3 = new RedisRunner().port(6902).randomDir().nosave(); + + ClusterRunner clusterRunner = new ClusterRunner() + .addNode(master1, slave1) + .addNode(master2, slave2) + .addNode(master3, slave3); + ClusterProcesses process = clusterRunner.run(); + + Thread.sleep(5000); + + Config config = new Config(); + config.useClusterServers() + .setLoadBalancer(new RandomLoadBalancer()) + .addNodeAddress(process.getNodes().stream().findAny().get().getRedisServerAddressAndPort()); + RedissonClient redisson = Redisson.create(config); + + final RBlockingQueue queue1 = redisson.getBlockingQueue("queue:pollany"); + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + RBlockingQueue queue2 = redisson.getBlockingQueue("queue:pollany1"); + RBlockingQueue queue3 = redisson.getBlockingQueue("queue:pollany2"); + try { + queue3.put(2); + queue1.put(1); + queue2.put(3); + } catch (InterruptedException e) { + Assert.fail(); + } + }, 3, TimeUnit.SECONDS); + + long s = System.currentTimeMillis(); + int l = queue1.pollFromAny(4, TimeUnit.SECONDS, "queue:pollany1", "queue:pollany2"); + + Assert.assertEquals(2, l); + Assert.assertTrue(System.currentTimeMillis() - s > 2000); + + redisson.shutdown(); + process.shutdown(); + } + @Test public void testPollFromAny() throws InterruptedException { final RBlockingQueue queue1 = redisson.getBlockingQueue("queue:pollany"); From 4e1331fde8889e9d3cb9ce4ea0b04e40f3b31114 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 7 Jan 2019 12:10:29 +0300 Subject: [PATCH 21/21] Fixed - NPE in CommandPubSubDecoder. #1838 --- .../client/handler/CommandPubSubDecoder.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/redisson/src/main/java/org/redisson/client/handler/CommandPubSubDecoder.java b/redisson/src/main/java/org/redisson/client/handler/CommandPubSubDecoder.java index df7d9a7f6..5e0772612 100644 --- a/redisson/src/main/java/org/redisson/client/handler/CommandPubSubDecoder.java +++ b/redisson/src/main/java/org/redisson/client/handler/CommandPubSubDecoder.java @@ -152,7 +152,7 @@ public class CommandPubSubDecoder extends CommandDecoder { pubSubConnection.onMessage((PubSubStatusMessage) result); } else if (result instanceof PubSubMessage) { pubSubConnection.onMessage((PubSubMessage) result); - } else { + } else if (result instanceof PubSubPatternMessage) { pubSubConnection.onMessage((PubSubPatternMessage) result); } } @@ -182,7 +182,7 @@ public class CommandPubSubDecoder extends CommandDecoder { pubSubConnection.onMessage((PubSubStatusMessage) result); } else if (result instanceof PubSubMessage) { pubSubConnection.onMessage((PubSubMessage) result); - } else { + } else if (result instanceof PubSubPatternMessage) { pubSubConnection.onMessage((PubSubPatternMessage) result); } } else { @@ -242,11 +242,11 @@ public class CommandPubSubDecoder extends CommandDecoder { if (parts.size() == 2 && "message".equals(parts.get(0))) { byte[] channelName = (byte[]) parts.get(1); - return entries.get(new ChannelName(channelName)).getDecoder().getDecoder(parts.size(), state()); + return getDecoder(parts, channelName); } if (parts.size() == 3 && "pmessage".equals(parts.get(0))) { byte[] patternName = (byte[]) parts.get(1); - return entries.get(new ChannelName(patternName)).getDecoder().getDecoder(parts.size(), state()); + return getDecoder(parts, patternName); } } @@ -257,4 +257,12 @@ public class CommandPubSubDecoder extends CommandDecoder { return super.selectDecoder(data, parts); } + private Decoder getDecoder(List parts, byte[] name) { + PubSubEntry entry = entries.get(new ChannelName(name)); + if (entry != null) { + return entry.getDecoder().getDecoder(parts.size(), state()); + } + return ByteArrayCodec.INSTANCE.getValueDecoder(); + } + }