diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java index 4cb2db4..6094d19 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java @@ -6,6 +6,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import com.imaginarycode.minecraft.redisbungee.internal.RedisBungeePlugin; import com.imaginarycode.minecraft.redisbungee.internal.summoners.JedisSummoner; +import com.imaginarycode.minecraft.redisbungee.internal.summoners.Summoner; +import com.imaginarycode.minecraft.redisbungee.internal.util.RedisBungeeMode; import org.checkerframework.checker.nullness.qual.NonNull; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; @@ -311,30 +313,60 @@ public class RedisBungeeAPI { * @since 0.7.0 */ public Jedis requestJedis() { - return this.plugin.getJedisSummoner().requestJedis(); + if (getMode() == RedisBungeeMode.SINGLE) { + return ((JedisSummoner) this.plugin.getSummoner()).obtainResource(); + } else { + throw new RuntimeException("RedisBungee is on Cluster MODE!"); + } } - /** * This gets Redis Bungee {@link JedisPool} * @return {@link JedisPool} * @since 0.6.5 */ public JedisPool getJedisPool() { - return this.plugin.getJedisSummoner().getJedisPool(); + if (getMode() == RedisBungeeMode.SINGLE) { + return ((JedisSummoner) this.plugin.getSummoner()).getJedisPool(); + } else { + throw new RuntimeException("RedisBungee is on Cluster MODE!"); + } } /** - * This gets Redis Bungee {@link JedisPool} - * @return {@link JedisPool} - * @since 0.6.5 - */ - public JedisSummoner getJedisSummoner() { - return this.plugin.getJedisSummoner(); - } - - - /** + * returns Summoner class responsible for Single Jedis {@link Jedis}, Cluster Jedis {@link redis.clients.jedis.JedisCluster} handling * + * @return {@link Summoner} + * @since 0.8.0 + */ + public Summoner> getSummoner() { + return this.plugin.getSummoner(); + } + + /** + * This gives you instance of Jedis Cluster + * @return {@link redis.clients.jedis.JedisCluster} + * @since 0.8.0 + */ + public Jedis requestClusterJedis() { + if (getMode() == RedisBungeeMode.CLUSTER) { + return ((JedisSummoner) this.plugin.getSummoner()).obtainResource(); + } else { + throw new RuntimeException("RedisBungee is on single MODE!"); + } + } + + /** + * shows what mode is RedisBungee is on + * @return {@link RedisBungeeMode} + * @since 0.8.0 + */ + public RedisBungeeMode getMode() { + return this.plugin.getRedisBungeeMode(); + } + + + /** + * Api instance * @return the API instance. * @since 0.6.5 */ diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/AbstractDataManager.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/AbstractDataManager.java index 4a9d91b..88d941d 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/AbstractDataManager.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/AbstractDataManager.java @@ -8,7 +8,9 @@ import com.google.common.util.concurrent.UncheckedExecutionException; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.imaginarycode.minecraft.redisbungee.internal.util.RedisTask; import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisCluster; import java.lang.reflect.InvocationTargetException; import java.net.InetAddress; @@ -52,12 +54,17 @@ public abstract class AbstractDataManager
{
return plugin.isPlayerOnAServer(player) ? plugin.getPlayerServerName(player) : null;
try {
- return serverCache.get(uuid, new Callable {
return plugin.getConfiguration().getServerId();
try {
- return proxyCache.get(uuid, new Callable {
return plugin.getPlayerIp(player);
try {
- return ipCache.get(uuid, new Callable {
return 0;
try {
- return lastOnlineCache.get(uuid, new Callable {
// Invalidate all entries related to this player, since they now lie. (call invalidate(uuid))
public abstract void onPostLogin(PL event);
+
// Invalidate all entries related to this player, since they now lie. (call invalidate(uuid))
public abstract void onPlayerDisconnect(PD event);
@@ -181,7 +202,8 @@ public abstract class AbstractDataManager {
Object event;
try {
event = plugin.getNetworkJoinEventClass().getDeclaredConstructor(UUID.class).newInstance(message1.getTarget());
- } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+ } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
+ NoSuchMethodException e) {
throw new RuntimeException("unable to dispatch an network join event", e);
}
plugin.callEvent(event);
@@ -200,7 +222,8 @@ public abstract class AbstractDataManager {
Object event;
try {
event = plugin.getNetworkQuitEventClass().getDeclaredConstructor(UUID.class).newInstance(message2.getTarget());
- } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+ } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
+ NoSuchMethodException e) {
throw new RuntimeException("unable to dispatch an network quit event", e);
}
plugin.callEvent(event);
@@ -217,7 +240,8 @@ public abstract class AbstractDataManager {
Object event;
try {
event = plugin.getServerChangeEventClass().getDeclaredConstructor(UUID.class, String.class, String.class).newInstance(message3.getTarget(), ((ServerChangePayload) message3.getPayload()).getOldServer(), ((ServerChangePayload) message3.getPayload()).getServer());
- } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+ } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
+ NoSuchMethodException e) {
throw new RuntimeException("unable to dispatch an server change event", e);
}
plugin.callEvent(event);
@@ -275,7 +299,7 @@ public abstract class AbstractDataManager {
}
}
- public static class ServerChangePayload{
+ public static class ServerChangePayload {
private final String server;
private final String oldServer;
diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/PubSubListener.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/PubSubListener.java
index 9e75aa2..3442db2 100644
--- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/PubSubListener.java
+++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/PubSubListener.java
@@ -1,13 +1,14 @@
package com.imaginarycode.minecraft.redisbungee.internal;
+import com.imaginarycode.minecraft.redisbungee.internal.util.RedisTask;
import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.exceptions.JedisConnectionException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
public class PubSubListener implements Runnable {
private JedisPubSubHandler jpsh;
@@ -21,27 +22,58 @@ public class PubSubListener implements Runnable {
@Override
public void run() {
- try (Jedis rsc = plugin.getJedisSummoner().requestJedis()) {
- try {
-
- jpsh = new JedisPubSubHandler(plugin);
- addedChannels.add("redisbungee-" + plugin.getConfiguration().getServerId());
- addedChannels.add("redisbungee-allservers");
- addedChannels.add("redisbungee-data");
- rsc.subscribe(jpsh, addedChannels.toArray(new String[0]));
- } catch (Exception e) {
- // FIXME: Extremely ugly hack
- // Attempt to unsubscribe this instance and try again.
- plugin.logWarn("PubSub error, attempting to recover.");
+ RedisTask extends EventsPlatform{
}
- Jedis requestJedis();
-
- boolean isJedisAvailable();
-
- JedisSummoner getJedisSummoner();
+ Summoner> getSummoner();
RedisBungeeConfiguration getConfiguration();
@@ -101,4 +98,6 @@ public interface RedisBungeePlugin extends EventsPlatform{
void loadConfig() throws Exception;
+ RedisBungeeMode getRedisBungeeMode();
+
}
diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/summoners/ClusterJedisSummoner.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/summoners/ClusterJedisSummoner.java
new file mode 100644
index 0000000..fbcb786
--- /dev/null
+++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/summoners/ClusterJedisSummoner.java
@@ -0,0 +1,30 @@
+package com.imaginarycode.minecraft.redisbungee.internal.summoners;
+
+import redis.clients.jedis.JedisCluster;
+
+import java.io.IOException;
+
+public class ClusterJedisSummoner implements Summoner extends Closeable {
+
+ P obtainResource();
+
+ boolean isAvailable();
+
+
+}
diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/util/LuaManager.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/util/LuaManager.java
index 52f8ebb..77dba56 100644
--- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/util/LuaManager.java
+++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/internal/util/LuaManager.java
@@ -2,6 +2,7 @@ package com.imaginarycode.minecraft.redisbungee.internal.util;
import com.imaginarycode.minecraft.redisbungee.internal.RedisBungeePlugin;
import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.exceptions.JedisDataException;
import java.util.List;
@@ -14,10 +15,20 @@ public class LuaManager {
}
public Script createScript(String script) {
- try (Jedis jedis = plugin.getJedisSummoner().requestJedis()) {
- String hash = jedis.scriptLoad(script);
- return new Script(script, hash);
- }
+ RedisTask