Merge branch 'master' into 3.0.0

pull/1933/head
Nikita Koksharov 6 years ago
commit b13061c82f

@ -28,12 +28,12 @@ Features
* [Asynchronous](https://github.com/redisson/redisson/wiki/3.-operations-execution#31-async-way) API
* Asynchronous connection pool
* Lua scripting
* [Distributed objects](https://github.com/redisson/redisson/wiki/6.-Distributed-objects)
* [Distributed Java objects](https://github.com/redisson/redisson/wiki/6.-Distributed-objects)
Object holder, Binary stream holder, Geospatial holder, BitSet, AtomicLong, AtomicDouble, PublishSubscribe,
Bloom filter, HyperLogLog
* [Distributed collections](https://github.com/redisson/redisson/wiki/7.-Distributed-collections)
* [Distributed Java collections](https://github.com/redisson/redisson/wiki/7.-Distributed-collections)
Map, Multimap, Set, List, SortedSet, ScoredSortedSet, LexSortedSet, Queue, Deque, Blocking Queue, Bounded Blocking Queue, Blocking Deque, Delayed Queue, Priority Queue, Priority Deque
* [Distributed locks and synchronizers](https://github.com/redisson/redisson/wiki/8.-Distributed-locks-and-synchronizers)
* [Distributed Java locks and synchronizers](https://github.com/redisson/redisson/wiki/8.-Distributed-locks-and-synchronizers)
Lock, FairLock, MultiLock, RedLock, ReadWriteLock, Semaphore, PermitExpirableSemaphore, CountDownLatch
* [Distributed services](https://github.com/redisson/redisson/wiki/9.-distributed-services)
Remote service, Live Object service, Executor service, Scheduler service, MapReduce service

@ -43,9 +43,11 @@ Each RedissonSessionManager created per Web Application and thus creates own Red
```xml
<GlobalNamingResources>
<Resource name="bean/redisson" auth="Container"
<Resource name="bean/redisson"
auth="Container"
factory="org.redisson.JndiRedissonFactory"
configPath="${catalina.base}/conf/redisson.yaml"/>
configPath="${catalina.base}/conf/redisson.yaml"
closeMethod="shutdown"/>
</GlobalNamingResources>
```
@ -61,8 +63,6 @@ Each RedissonSessionManager created per Web Application and thus creates own Red
jndiName="bean/redisson" />
```
3. Package all classes used in session into separate jar and copy it to `tomcat/lib` directory.
**2** Copy two jars into `TOMCAT_BASE/lib` directory:
1. __For JDK 1.8+__

@ -197,7 +197,7 @@ public class RedissonRateLimiter extends RedissonObject implements RRateLimiter
+ "assert(rate ~= false and interval ~= false and type ~= false, 'RateLimiter is not initialized')"
+ "local valueName = KEYS[2];"
+ "if type == 1 then "
+ "if type == '1' then "
+ "valueName = KEYS[3];"
+ "end;"

@ -15,11 +15,13 @@
*/
package org.redisson.connection;
import org.redisson.connection.dns.MultiDnsAddressResolverGroup;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.resolver.ResolvedAddressTypes;
import io.netty.resolver.dns.DnsAddressResolverGroup;
import io.netty.resolver.dns.DnsNameResolverBuilder;
import io.netty.resolver.dns.DnsServerAddressStreamProvider;
import io.netty.resolver.dns.DnsServerAddressStreamProviders;
/**
* Workaround for https://github.com/netty/netty/issues/8261
@ -32,7 +34,11 @@ public class MultiDnsAddressResolverGroupFactory implements AddressResolverGroup
@Override
public DnsAddressResolverGroup create(Class<? extends DatagramChannel> channelType,
DnsServerAddressStreamProvider nameServerProvider) {
return new MultiDnsAddressResolverGroup(channelType, nameServerProvider);
return new DnsAddressResolverGroup(new DnsNameResolverBuilder()
.channelType(NioDatagramChannel.class)
.nameServerProvider(DnsServerAddressStreamProviders.platformDefault())
.resolvedAddressTypes(ResolvedAddressTypes.IPV4_ONLY));
}
}

@ -1,124 +0,0 @@
/**
* Copyright (c) 2013-2019 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.connection.dns;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import io.netty.resolver.AddressResolver;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.FutureListener;
import io.netty.util.concurrent.ImmediateEventExecutor;
import io.netty.util.concurrent.Promise;
/**
* Workaround for https://github.com/netty/netty/issues/8261
*
* @author Nikita Koksharov
*
*/
class GroupAddressResolver implements AddressResolver<InetSocketAddress> {
private final List<AddressResolver<InetSocketAddress>> resolvers;
public GroupAddressResolver(List<AddressResolver<InetSocketAddress>> resolvers) {
super();
this.resolvers = resolvers;
}
@Override
public boolean isSupported(SocketAddress address) {
for (AddressResolver<InetSocketAddress> addressResolver : resolvers) {
if (addressResolver.isSupported(address)) {
return true;
}
}
return false;
}
@Override
public boolean isResolved(SocketAddress address) {
for (AddressResolver<InetSocketAddress> addressResolver : resolvers) {
if (addressResolver.isResolved(address)) {
return true;
}
}
return false;
}
@Override
public Future<InetSocketAddress> resolve(SocketAddress address) {
final Promise<InetSocketAddress> promise = ImmediateEventExecutor.INSTANCE.newPromise();
final AtomicInteger counter = new AtomicInteger(resolvers.size());
for (AddressResolver<InetSocketAddress> addressResolver : resolvers) {
addressResolver.resolve(address).addListener(new FutureListener<InetSocketAddress>() {
@Override
public void operationComplete(Future<InetSocketAddress> future) throws Exception {
if (future.isSuccess()) {
promise.trySuccess(future.getNow());
}
if (counter.decrementAndGet() == 0) {
if (!future.isSuccess()) {
promise.tryFailure(future.cause());
}
}
}
});
}
return promise;
}
@Override
public Future<InetSocketAddress> resolve(SocketAddress address, Promise<InetSocketAddress> promise) {
throw new UnsupportedOperationException();
}
@Override
public Future<List<InetSocketAddress>> resolveAll(SocketAddress address) {
final Promise<List<InetSocketAddress>> promise = ImmediateEventExecutor.INSTANCE.newPromise();
final AtomicInteger counter = new AtomicInteger(resolvers.size());
for (AddressResolver<InetSocketAddress> addressResolver : resolvers) {
addressResolver.resolveAll(address).addListener(new FutureListener<List<InetSocketAddress>>() {
@Override
public void operationComplete(Future<List<InetSocketAddress>> future) throws Exception {
if (future.isSuccess()) {
promise.trySuccess(future.getNow());
}
if (counter.decrementAndGet() == 0) {
if (!future.isSuccess()) {
promise.tryFailure(future.cause());
}
}
}
});
}
return promise;
}
@Override
public Future<List<InetSocketAddress>> resolveAll(SocketAddress address, Promise<List<InetSocketAddress>> promise) {
throw new UnsupportedOperationException();
}
@Override
public void close() {
}
}

@ -1,80 +0,0 @@
/**
* Copyright (c) 2013-2019 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.connection.dns;
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;
/**
* Workaround for https://github.com/netty/netty/issues/8261
*
* @author Nikita Koksharov
*
*/
public class MultiDnsAddressResolverGroup extends DnsAddressResolverGroup {
private final List<DnsAddressResolverGroup> groups = new ArrayList<DnsAddressResolverGroup>();
public MultiDnsAddressResolverGroup(
Class<? extends DatagramChannel> channelType,
DnsServerAddressStreamProvider nameServerProvider) {
super(channelType, nameServerProvider);
DnsServerAddressStream t = nameServerProvider.nameServerAddressStream("");
InetSocketAddress firstDNS = t.next();
while (true) {
InetSocketAddress dns = t.next();
DnsAddressResolverGroup group = new DnsAddressResolverGroup(channelType,
new SingletonDnsServerAddressStreamProvider(dns));
groups.add(group);
if (dns == firstDNS) {
break;
}
}
// workaround for short DNS names
groups.add(new DnsAddressResolverGroup(channelType, nameServerProvider));
}
@Override
protected AddressResolver<InetSocketAddress> newResolver(EventLoop eventLoop,
ChannelFactory<? extends DatagramChannel> channelFactory, DnsServerAddressStreamProvider nameServerProvider)
throws Exception {
List<AddressResolver<InetSocketAddress>> resolvers = new ArrayList<AddressResolver<InetSocketAddress>>();
for (DnsAddressResolverGroup group : groups) {
resolvers.add(group.getResolver(eventLoop));
}
return new GroupAddressResolver(resolvers);
}
@Override
public void close() {
for (DnsAddressResolverGroup group : groups) {
group.close();
}
}
}
Loading…
Cancel
Save