diff --git a/pom.xml b/pom.xml
index 3bfa442..e0e22e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -141,7 +141,13 @@
redis.clients
jedis
- 2.5.1
+ 2.7.2
+ compile
+
+
+ org.apache.commons
+ commons-pool2
+ 2.3
compile
diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java
index c3acafa..d088650 100644
--- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java
+++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java
@@ -130,20 +130,14 @@ public final class RedisBungee extends Plugin {
final int getCount() {
int c = 0;
if (pool != null) {
- Jedis rsc;
- rsc = pool.getResource();
- try {
+ try (Jedis rsc = pool.getResource()){
for (String i : getServerIds()) {
c += rsc.scard("proxy:" + i + ":usersOnline");
}
} catch (JedisConnectionException e) {
// Redis server has disappeared!
getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e);
- if (rsc != null)
- pool.returnBrokenResource(rsc);
throw new RuntimeException("Unable to get total player count", e);
- } finally {
- pool.returnResource(rsc);
}
}
return c;
@@ -163,8 +157,7 @@ public final class RedisBungee extends Plugin {
final Set getPlayers() {
ImmutableSet.Builder setBuilder = ImmutableSet.builder();
if (pool != null) {
- Jedis rsc = pool.getResource();
- try {
+ try (Jedis rsc = pool.getResource();) {
List keys = new ArrayList<>();
for (String i : getServerIds()) {
keys.add("proxy:" + i + ":usersOnline");
@@ -183,11 +176,7 @@ public final class RedisBungee extends Plugin {
} catch (JedisConnectionException e) {
// Redis server has disappeared!
getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e);
- if (rsc != null)
- pool.returnBrokenResource(rsc);
throw new RuntimeException("Unable to get all players online", e);
- } finally {
- pool.returnResource(rsc);
}
}
return setBuilder.build();
@@ -204,17 +193,12 @@ public final class RedisBungee extends Plugin {
}
final void sendChannelMessage(String channel, String message) {
- Jedis jedis = pool.getResource();
- try {
+ try (Jedis jedis = pool.getResource()) {
jedis.publish(channel, message);
} catch (JedisConnectionException e) {
// Redis server has disappeared!
getLogger().log(Level.SEVERE, "Unable to get connection from pool - did your Redis server go away?", e);
- if (jedis != null)
- pool.returnBrokenResource(jedis);
throw new RuntimeException("Unable to publish channel message", e);
- } finally {
- pool.returnResource(jedis);
}
}
@@ -271,8 +255,7 @@ public final class RedisBungee extends Plugin {
integrityCheck = getProxy().getScheduler().schedule(this, new Runnable() {
@Override
public void run() {
- Jedis tmpRsc = pool.getResource();
- try {
+ try (Jedis tmpRsc = pool.getResource()) {
Set players = new HashSet<>(getLocalPlayersAsUuidStrings());
Set redisCollection = tmpRsc.smembers("proxy:" + configuration.getServerId() + ":usersOnline");
@@ -306,8 +289,6 @@ public final class RedisBungee extends Plugin {
getLogger().warning("Player " + player + " is on the proxy but not in Redis.");
tmpRsc.sadd("proxy:" + configuration.getServerId() + ":usersOnline", player);
}
- } finally {
- pool.returnResource(tmpRsc);
}
}
}, 0, 1, TimeUnit.MINUTES);
@@ -387,10 +368,20 @@ public final class RedisBungee extends Plugin {
FutureTask task = new FutureTask<>(new Callable() {
@Override
public JedisPool call() throws Exception {
+ // With recent versions of Jedis, we must set the classloader to the one BungeeCord used
+ // to load RedisBungee with.
+ ClassLoader previous = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(RedisBungee.class.getClassLoader());
+
+ // Create the pool...
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(configuration.getInt("max-redis-connections", 8));
config.setJmxEnabled(false);
- return new JedisPool(config, redisServer, redisPort, 0, finalRedisPassword);
+ JedisPool pool = new JedisPool(config, redisServer, redisPort, 0, finalRedisPassword);
+
+ // Reset classloader and return the pool
+ Thread.currentThread().setContextClassLoader(previous);
+ return pool;
}
});