Skip to content

Commit 0d77298

Browse files
authored
Pipeline & Transaction with failover to multi cluster (#3602)
1 parent 452ea52 commit 0d77298

21 files changed

+5204
-8774
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package redis.clients.jedis;
2+
3+
import java.io.Closeable;
4+
5+
public abstract class AbstractPipeline extends PipeliningBase implements Closeable {
6+
7+
protected AbstractPipeline(CommandObjects commandObjects) {
8+
super(commandObjects);
9+
}
10+
11+
@Override
12+
public abstract void close();
13+
14+
/**
15+
* Synchronize pipeline by reading all responses.
16+
*/
17+
public abstract void sync();
18+
19+
public Response<Long> publish(String channel, String message) {
20+
return appendCommand(commandObjects.publish(channel, message));
21+
}
22+
23+
public Response<Long> publish(byte[] channel, byte[] message) {
24+
return appendCommand(commandObjects.publish(channel, message));
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package redis.clients.jedis;
2+
3+
import java.io.Closeable;
4+
import java.util.List;
5+
6+
public abstract class AbstractTransaction extends PipeliningBase implements Closeable {
7+
8+
protected AbstractTransaction() {
9+
super(new CommandObjects());
10+
}
11+
12+
public abstract void multi();
13+
14+
/**
15+
* Must be called before {@link AbstractTransaction#multi() MULTI}.
16+
*/
17+
public abstract String watch(final String... keys);
18+
19+
/**
20+
* Must be called before {@link AbstractTransaction#multi() MULTI}.
21+
*/
22+
public abstract String watch(final byte[]... keys);
23+
24+
public abstract String unwatch();
25+
26+
@Override public abstract void close();
27+
28+
public abstract List<Object> exec();
29+
30+
public abstract String discard();
31+
32+
public Response<Long> waitReplicas(int replicas, long timeout) {
33+
return appendCommand(commandObjects.waitReplicas(replicas, timeout));
34+
}
35+
}

src/main/java/redis/clients/jedis/CommandObjects.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,12 @@ public class CommandObjects {
4040

4141
private RedisProtocol protocol;
4242

43-
protected void setProtocol(RedisProtocol proto) {
43+
// TODO: restrict?
44+
public final void setProtocol(RedisProtocol proto) {
4445
this.protocol = proto;
4546
}
4647

48+
// TODO: remove?
4749
protected RedisProtocol getProtocol() {
4850
return protocol;
4951
}

src/main/java/redis/clients/jedis/Connection.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public String toString() {
7272
return "Connection{" + socketFactory + "}";
7373
}
7474

75-
final RedisProtocol getRedisProtocol() {
75+
public final RedisProtocol getRedisProtocol() {
7676
return protocol;
7777
}
7878

src/main/java/redis/clients/jedis/MultiNodePipelineBase.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package redis.clients.jedis;
22

3-
import java.io.Closeable;
43
import java.util.Iterator;
54
import java.util.LinkedHashMap;
65
import java.util.LinkedList;
@@ -14,16 +13,12 @@
1413
import org.slf4j.Logger;
1514
import org.slf4j.LoggerFactory;
1615

17-
import redis.clients.jedis.commands.PipelineBinaryCommands;
18-
import redis.clients.jedis.commands.PipelineCommands;
19-
import redis.clients.jedis.commands.RedisModulePipelineCommands;
2016
import redis.clients.jedis.exceptions.JedisConnectionException;
2117
import redis.clients.jedis.graph.GraphCommandObjects;
2218
import redis.clients.jedis.providers.ConnectionProvider;
2319
import redis.clients.jedis.util.IOUtils;
2420

25-
public abstract class MultiNodePipelineBase extends PipelineBase
26-
implements PipelineCommands, PipelineBinaryCommands, RedisModulePipelineCommands, Closeable {
21+
public abstract class MultiNodePipelineBase extends PipelineBase {
2722

2823
private final Logger log = LoggerFactory.getLogger(getClass());
2924

src/main/java/redis/clients/jedis/Pipeline.java

+5-9
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@
77
import java.util.Queue;
88

99
import redis.clients.jedis.commands.DatabasePipelineCommands;
10-
import redis.clients.jedis.commands.PipelineBinaryCommands;
11-
import redis.clients.jedis.commands.PipelineCommands;
12-
import redis.clients.jedis.commands.RedisModulePipelineCommands;
1310
import redis.clients.jedis.exceptions.JedisDataException;
1411
import redis.clients.jedis.graph.GraphCommandObjects;
1512
import redis.clients.jedis.params.*;
1613
import redis.clients.jedis.util.KeyValue;
1714

18-
public class Pipeline extends PipelineBase implements PipelineCommands, PipelineBinaryCommands,
19-
DatabasePipelineCommands, RedisModulePipelineCommands, Closeable {
15+
public class Pipeline extends PipelineBase implements DatabasePipelineCommands, Closeable {
2016

2117
private final Queue<Response<?>> pipelinedResponses = new LinkedList<>();
2218
protected final Connection connection;
@@ -66,8 +62,8 @@ public void close() {
6662
public void sync() {
6763
if (!hasPipelinedResponse()) return;
6864
List<Object> unformatted = connection.getMany(pipelinedResponses.size());
69-
for (Object o : unformatted) {
70-
pipelinedResponses.poll().set(o);
65+
for (Object rawReply : unformatted) {
66+
pipelinedResponses.poll().set(rawReply);
7167
}
7268
}
7369

@@ -81,10 +77,10 @@ public List<Object> syncAndReturnAll() {
8177
if (hasPipelinedResponse()) {
8278
List<Object> unformatted = connection.getMany(pipelinedResponses.size());
8379
List<Object> formatted = new ArrayList<>();
84-
for (Object o : unformatted) {
80+
for (Object rawReply : unformatted) {
8581
try {
8682
Response<?> response = pipelinedResponses.poll();
87-
response.set(o);
83+
response.set(rawReply);
8884
formatted.add(response.get());
8985
} catch (JedisDataException e) {
9086
formatted.add(e);

0 commit comments

Comments
 (0)