From 9a44460e61e34ce4246df2fb1d1244cd32079a7c Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 16 Nov 2018 23:01:13 +0300 Subject: [PATCH 1/7] Update README.md --- redisson-spring-boot-starter/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/redisson-spring-boot-starter/README.md b/redisson-spring-boot-starter/README.md index 379a7341e..e160a992c 100644 --- a/redisson-spring-boot-starter/README.md +++ b/redisson-spring-boot-starter/README.md @@ -5,6 +5,8 @@ Integrates Redisson with Spring Boot library. Depends on [Spring Data Redis](htt Supports Spring Boot 1.3.x, 1.4.x, 1.5.x, 2.0.x +Please consider __[Redisson PRO](https://redisson.pro)__ version for advanced features and support by SLA. + Usage === @@ -64,3 +66,4 @@ spring.redis.redisson.config=classpath:redisson.yaml ``` ### 3. Get access to Redisson through spring bean with `RedissonClient` interface + From e668c6d0deab1aecb4ca67240e5231adcdfdeac1 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 16 Nov 2018 23:01:36 +0300 Subject: [PATCH 2/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b5c21f5d9..f2193a487 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ RExecutorService executor = redisson.getExecutorService("myExecutorService"); ``` -Please consider __[Redisson PRO](https://redisson.pro)__ version for advanced features and support by SLA. +Please consider __[Redisson PRO](https://redisson.pro)__ version for advanced features and support by SLA. Downloads =============================== From 5f5836f5a154372de3a812d9c828aca034ea0f16 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 16 Nov 2018 23:02:07 +0300 Subject: [PATCH 3/7] Update README.md --- redisson-spring-data/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/redisson-spring-data/README.md b/redisson-spring-data/README.md index 02350257c..ca0f500a4 100644 --- a/redisson-spring-data/README.md +++ b/redisson-spring-data/README.md @@ -5,6 +5,8 @@ Integrates Redisson with Spring Data Redis library. Provides ability to work wit Supports Spring Data Redis 1.6.x, 1.7.x, 1.8.x, 2.0.x +Please consider __[Redisson PRO](https://redisson.pro)__ version for advanced features and support by SLA. + Usage === From 6c1eee987d74b23c247f4fdcfafc617a326f78c9 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Fri, 16 Nov 2018 23:02:29 +0300 Subject: [PATCH 4/7] Update README.md --- redisson-tomcat/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/redisson-tomcat/README.md b/redisson-tomcat/README.md index e66c392d1..696b27e62 100644 --- a/redisson-tomcat/README.md +++ b/redisson-tomcat/README.md @@ -5,6 +5,8 @@ Stores session of Apache Tomcat in Redis and allows to distribute requests acros Supports Apache Tomcat 6.x, 7.x, 8.x, 9.x +Please consider __[Redisson PRO](https://redisson.pro)__ version for advanced features and support by SLA. + Advantages === From 39a131137c7fda5895db8e04abec861fc8a2fa4f Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 19 Nov 2018 18:03:31 +0300 Subject: [PATCH 5/7] Fixed - RStream commands don't work with Redis 5.0.1 version --- .../redisson/client/protocol/CommandData.java | 5 +- .../client/protocol/RedisCommands.java | 94 +++++++++++++------ .../protocol/decoder/ObjectDecoder.java | 47 ++++++++++ .../decoder/ObjectMapReplayDecoder.java | 28 +++--- .../protocol/decoder/StreamIdDecoder.java | 41 ++++++++ .../redisson/command/CommandAsyncService.java | 8 +- 6 files changed, 170 insertions(+), 53 deletions(-) create mode 100644 redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectDecoder.java create mode 100644 redisson/src/main/java/org/redisson/client/protocol/decoder/StreamIdDecoder.java diff --git a/redisson/src/main/java/org/redisson/client/protocol/CommandData.java b/redisson/src/main/java/org/redisson/client/protocol/CommandData.java index b17d94e6f..44fd49205 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/CommandData.java +++ b/redisson/src/main/java/org/redisson/client/protocol/CommandData.java @@ -97,9 +97,8 @@ public class CommandData implements QueueCommand { } public boolean isBlockingCommand() { - return RedisCommands.BLOCKING_COMMANDS.contains(command.getName()) - || RedisCommands.XREAD_BLOCKING_SINGLE == command - || RedisCommands.XREAD_BLOCKING == command; + return RedisCommands.BLOCKING_COMMAND_NAMES.contains(command.getName()) + || RedisCommands.BLOCKING_COMMANDS.contains(command); } @Override diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index 4d4d14eeb..51d3118a4 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -24,6 +24,7 @@ import java.util.Set; import org.redisson.api.RType; import org.redisson.api.StreamId; +import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.RedisCommand.ValueType; import org.redisson.client.protocol.convertor.BitsSizeReplayConvertor; import org.redisson.client.protocol.convertor.BooleanAmountReplayConvertor; @@ -53,8 +54,10 @@ import org.redisson.client.protocol.decoder.Long2MultiDecoder; import org.redisson.client.protocol.decoder.LongMultiDecoder; import org.redisson.client.protocol.decoder.MapScanResult; import org.redisson.client.protocol.decoder.MapScanResultReplayDecoder; +import org.redisson.client.protocol.decoder.ObjectDecoder; import org.redisson.client.protocol.decoder.ObjectFirstScoreReplayDecoder; import org.redisson.client.protocol.decoder.ObjectListReplayDecoder; +import org.redisson.client.protocol.decoder.ObjectMapDecoder; import org.redisson.client.protocol.decoder.ObjectMapEntryReplayDecoder; import org.redisson.client.protocol.decoder.ObjectMapJoinDecoder; import org.redisson.client.protocol.decoder.ObjectMapReplayDecoder; @@ -66,6 +69,7 @@ import org.redisson.client.protocol.decoder.ScoredSortedSetReplayDecoder; import org.redisson.client.protocol.decoder.ScoredSortedSetScanDecoder; import org.redisson.client.protocol.decoder.ScoredSortedSetScanReplayDecoder; import org.redisson.client.protocol.decoder.SlotsDecoder; +import org.redisson.client.protocol.decoder.StreamIdDecoder; import org.redisson.client.protocol.decoder.StreamResultDecoder; import org.redisson.client.protocol.decoder.StringDataDecoder; import org.redisson.client.protocol.decoder.StringListReplayDecoder; @@ -209,7 +213,7 @@ public interface RedisCommands { RedisCommand BZPOPMIN_VALUE = new RedisCommand("BZPOPMIN", new ScoredSortedSetPolledObjectDecoder()); RedisCommand BZPOPMAX_VALUE = new RedisCommand("BZPOPMAX", new ScoredSortedSetPolledObjectDecoder()); - Set BLOCKING_COMMANDS = new HashSet( + Set BLOCKING_COMMAND_NAMES = new HashSet( Arrays.asList(BLPOP_VALUE.getName(), BRPOP_VALUE.getName(), BRPOPLPUSH.getName(), BZPOPMIN_VALUE.getName(), BZPOPMAX_VALUE.getName(), BLPOP.getName(), BRPOP.getName())); @@ -321,50 +325,82 @@ public interface RedisCommands { RedisCommand SETNX = new RedisCommand("SETNX", new BooleanReplayConvertor()); RedisCommand PSETEX = new RedisCommand("PSETEX", new VoidReplayConvertor()); - RedisCommand>>> XREVRANGE = new RedisCommand>>>("XREVRANGE", - new ListMultiDecoder(new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET, new StreamIdConvertor()), - new ObjectMapJoinDecoder())); - RedisCommand>>> XRANGE = new RedisCommand>>>("XRANGE", - new ListMultiDecoder(new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET, new StreamIdConvertor()), + new ListMultiDecoder( + new ObjectDecoder(new StreamIdDecoder()), + new ObjectMapReplayDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET), new ObjectMapJoinDecoder())); + + RedisCommand>>> XREVRANGE = new RedisCommand>>>("XREVRANGE", + XRANGE.getReplayMultiDecoder()); RedisCommand>>> XREAD = new RedisCommand>>>("XREAD", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_INDEX))); - - RedisCommand>>> XREAD_BLOCKING = new RedisCommand>>>("XREAD", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_INDEX))); + new ListMultiDecoder( + new ObjectDecoder(StringCodec.INSTANCE.getValueDecoder()), + new ObjectDecoder(new StreamIdDecoder()), + new ObjectMapReplayDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1), + new ObjectMapJoinDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_INDEX), + new StreamResultDecoder())); + + RedisCommand>>> XREAD_BLOCKING = new RedisCommand>>>("XREAD", XREAD.getReplayMultiDecoder()); RedisCommand>> XREAD_SINGLE = new RedisCommand>>("XREAD", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(), new StreamResultDecoder())); + new ListMultiDecoder( + new ObjectDecoder(StringCodec.INSTANCE.getValueDecoder()), + new ObjectDecoder(new StreamIdDecoder()), + new ObjectMapReplayDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1), + new ObjectMapJoinDecoder(), + new ObjectMapReplayDecoder(), + new StreamResultDecoder())); - RedisCommand>> XREAD_BLOCKING_SINGLE = new RedisCommand>>("XREAD", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(), new StreamResultDecoder())); + RedisCommand>> XREAD_BLOCKING_SINGLE = new RedisCommand>>("XREAD", XREAD_SINGLE.getReplayMultiDecoder()); RedisCommand>>> XREADGROUP = new RedisCommand>>>("XREADGROUP", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_INDEX))); - - RedisCommand>> XREADGROUP_BLOCKING = new RedisCommand>>("XREADGROUP", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_INDEX))); + new ListMultiDecoder( + new ObjectDecoder(StringCodec.INSTANCE.getValueDecoder()), + new ObjectDecoder(new StreamIdDecoder()), + new ObjectMapReplayDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1), + new ObjectMapJoinDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_INDEX), + new StreamResultDecoder())); + RedisCommand>> XREADGROUP_BLOCKING = new RedisCommand>>("XREADGROUP", + new ListMultiDecoder( + new ObjectDecoder(StringCodec.INSTANCE.getValueDecoder()), + new ObjectDecoder(new StreamIdDecoder()), + new ObjectMapReplayDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1), + new ObjectMapJoinDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_INDEX), + new StreamResultDecoder())); + RedisCommand>> XREADGROUP_SINGLE = new RedisCommand>>("XREADGROUP", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(), new StreamResultDecoder())); + new ListMultiDecoder( + new ObjectDecoder(StringCodec.INSTANCE.getValueDecoder()), + new ObjectDecoder(new StreamIdDecoder()), + new ObjectMapReplayDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1), + new ObjectMapJoinDecoder(), + new ObjectMapReplayDecoder(), + new StreamResultDecoder())); RedisCommand>>> XCLAIM = new RedisCommand>>>("XCLAIM", - new ListMultiDecoder(new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET, new StreamIdConvertor()), + new ListMultiDecoder( + new ObjectDecoder(new StreamIdDecoder()), + new ObjectMapReplayDecoder(), + new ObjectMapReplayDecoder(ListMultiDecoder.RESET), new ObjectMapJoinDecoder())); - + RedisCommand>> XREADGROUP_BLOCKING_SINGLE = new RedisCommand>>("XREADGROUP", - new ListMultiDecoder(new ListResultReplayDecoder(), new ObjectMapReplayDecoder(), new ObjectMapReplayDecoder(ListMultiDecoder.RESET_1, new StreamIdConvertor()), - new ObjectMapJoinDecoder(), new ObjectMapReplayDecoder(), new StreamResultDecoder())); + XREADGROUP_SINGLE.getReplayMultiDecoder()); + Set BLOCKING_COMMANDS = new HashSet(Arrays.asList( + XREAD_BLOCKING_SINGLE, XREAD_BLOCKING, XREADGROUP_BLOCKING_SINGLE, XREADGROUP_BLOCKING)); RedisStrictCommand XADD = new RedisStrictCommand("XADD", new StreamIdConvertor()); RedisStrictCommand XGROUP = new RedisStrictCommand("XGROUP", new VoidReplayConvertor()); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectDecoder.java new file mode 100644 index 000000000..18269aaf7 --- /dev/null +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectDecoder.java @@ -0,0 +1,47 @@ +/** + * 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.client.protocol.decoder; + +import java.util.List; + +import org.redisson.client.handler.State; +import org.redisson.client.protocol.Decoder; + +/** + * + * @author Nikita Koksharov + * + */ +public class ObjectDecoder implements MultiDecoder { + + private Decoder decoder; + + public ObjectDecoder(Decoder decoder) { + super(); + this.decoder = decoder; + } + + @Override + public Decoder getDecoder(int paramNum, State state) { + return decoder; + } + + @Override + public Object decode(List parts, State state) { + throw new IllegalStateException(); + } + +} diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java index 2454c7ff6..10cde48de 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java @@ -21,7 +21,6 @@ import java.util.Map; import org.redisson.client.handler.State; import org.redisson.client.protocol.Decoder; -import org.redisson.client.protocol.convertor.Convertor; /** * @@ -31,7 +30,6 @@ import org.redisson.client.protocol.convertor.Convertor; public class ObjectMapReplayDecoder implements MultiDecoder> { private Decoder codec; - private Convertor convertor; public ObjectMapReplayDecoder() { } @@ -41,25 +39,23 @@ public class ObjectMapReplayDecoder implements MultiDecoder> this.codec = codec; } - public ObjectMapReplayDecoder(Decoder codec, Convertor convertor) { - super(); - this.codec = codec; - this.convertor = convertor; - } - @Override public Map decode(List parts, State state) { - Map result = new LinkedHashMap(parts.size()/2); - for (int i = 0; i < parts.size(); i++) { - if (i % 2 != 0) { - if (convertor != null) { - result.put(convertor.convert(parts.get(i-1)), parts.get(i)); - } else { + if (parts.get(0) instanceof Map) { + Map result = new LinkedHashMap(parts.size()); + for (int i = 0; i < parts.size(); i++) { + result.putAll((Map) parts.get(i)); + } + return result; + } else { + Map result = new LinkedHashMap(parts.size()/2); + for (int i = 0; i < parts.size(); i++) { + if (i % 2 != 0) { result.put(parts.get(i-1), parts.get(i)); } - } + } + return result; } - return result; } @Override diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/StreamIdDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/StreamIdDecoder.java new file mode 100644 index 000000000..ef4a31ae7 --- /dev/null +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/StreamIdDecoder.java @@ -0,0 +1,41 @@ +/** + * 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.client.protocol.decoder; + +import java.io.IOException; + +import org.redisson.api.StreamId; +import org.redisson.client.codec.StringCodec; +import org.redisson.client.handler.State; +import org.redisson.client.protocol.Decoder; + +import io.netty.buffer.ByteBuf; + +/** + * + * @author Nikita Koksharov + * + */ +public class StreamIdDecoder implements Decoder { + + @Override + public Object decode(ByteBuf buf, State state) throws IOException { + String id = (String) StringCodec.INSTANCE.getValueDecoder().decode(buf, state); + String[] parts = id.toString().split("-"); + return new StreamId(Long.valueOf(parts[0]), Long.valueOf(parts[1])); + } + +} diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index e1106ea14..b131ce09d 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -846,12 +846,10 @@ public class CommandAsyncService implements CommandAsyncExecutor { details.getTimeout().cancel(); long timeoutTime = connectionManager.getConfig().getTimeout(); - if (RedisCommands.BLOCKING_COMMANDS.contains(details.getCommand().getName()) - || RedisCommands.XREAD_BLOCKING_SINGLE == details.getCommand() - || RedisCommands.XREAD_BLOCKING == details.getCommand()) { + if (RedisCommands.BLOCKING_COMMAND_NAMES.contains(details.getCommand().getName()) + || RedisCommands.BLOCKING_COMMANDS.contains(details.getCommand())) { Long popTimeout = null; - if (RedisCommands.XREAD_BLOCKING_SINGLE == details.getCommand() - || RedisCommands.XREAD_BLOCKING == details.getCommand()) { + if (RedisCommands.BLOCKING_COMMANDS.contains(details.getCommand())) { boolean found = false; for (Object param : details.getParams()) { if (found) { From c9eacf7e3ae249804c3abc5c5ee9b90a0c5a6a74 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 19 Nov 2018 19:20:25 +0300 Subject: [PATCH 6/7] Improvement - Redis url validation --- redisson/src/main/java/org/redisson/misc/URIBuilder.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/redisson/src/main/java/org/redisson/misc/URIBuilder.java b/redisson/src/main/java/org/redisson/misc/URIBuilder.java index ea5d2645b..b3ace470b 100644 --- a/redisson/src/main/java/org/redisson/misc/URIBuilder.java +++ b/redisson/src/main/java/org/redisson/misc/URIBuilder.java @@ -28,6 +28,11 @@ import java.net.URI; public class URIBuilder { public static URI create(String uri) { + if (!uri.startsWith("redis://") + && !uri.startsWith("rediss://")) { + throw new IllegalArgumentException("Redis url should start with redis:// or rediss:// (for SSL connection)"); + } + URI u = URI.create(uri); // Let's assuming most of the time it is OK. if (u.getHost() != null) { From eafe7c60f8d84c5d2095cebfae28d5e3f0adf9d2 Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Mon, 19 Nov 2018 19:31:29 +0300 Subject: [PATCH 7/7] Fixed - DNS channels aren't pooled. #1729 --- .../connection/dns/MultiDnsAddressResolverGroup.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/redisson/src/main/java/org/redisson/connection/dns/MultiDnsAddressResolverGroup.java b/redisson/src/main/java/org/redisson/connection/dns/MultiDnsAddressResolverGroup.java index b96206ac0..caaf9eb8b 100644 --- a/redisson/src/main/java/org/redisson/connection/dns/MultiDnsAddressResolverGroup.java +++ b/redisson/src/main/java/org/redisson/connection/dns/MultiDnsAddressResolverGroup.java @@ -19,13 +19,14 @@ import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; +import io.netty.channel.ChannelFactory; +import io.netty.channel.EventLoop; import io.netty.channel.socket.DatagramChannel; import io.netty.resolver.AddressResolver; import io.netty.resolver.dns.DnsAddressResolverGroup; import io.netty.resolver.dns.DnsServerAddressStream; import io.netty.resolver.dns.DnsServerAddressStreamProvider; import io.netty.resolver.dns.SingletonDnsServerAddressStreamProvider; -import io.netty.util.concurrent.EventExecutor; /** * Workaround for https://github.com/netty/netty/issues/8261 @@ -59,10 +60,12 @@ public class MultiDnsAddressResolverGroup extends DnsAddressResolverGroup { } @Override - public AddressResolver getResolver(EventExecutor executor) { + protected AddressResolver newResolver(EventLoop eventLoop, + ChannelFactory channelFactory, DnsServerAddressStreamProvider nameServerProvider) + throws Exception { List> resolvers = new ArrayList>(); for (DnsAddressResolverGroup group : groups) { - resolvers.add(group.getResolver(executor)); + resolvers.add(group.getResolver(eventLoop)); } return new GroupAddressResolver(resolvers); }