Skip to content

Commit b7dcaea

Browse files
committed
XRead(Group) Params with allowing block=0
1 parent 6b419d5 commit b7dcaea

16 files changed

+491
-113
lines changed

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

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import static redis.clients.jedis.Protocol.Keyword.WITHSCORES;
1515
import static redis.clients.jedis.Protocol.Keyword.FREQ;
1616
import static redis.clients.jedis.Protocol.Keyword.HELP;
17-
import static redis.clients.jedis.Protocol.Keyword.COUNT;
1817

1918
import java.util.ArrayList;
2019
import java.util.Collections;
@@ -27,14 +26,7 @@
2726
import javax.net.ssl.SSLSocketFactory;
2827

2928
import redis.clients.jedis.Protocol.Keyword;
30-
import redis.clients.jedis.params.ClientKillParams;
31-
import redis.clients.jedis.params.GeoRadiusParam;
32-
import redis.clients.jedis.params.GeoRadiusStoreParam;
33-
import redis.clients.jedis.params.MigrateParams;
34-
import redis.clients.jedis.params.SetParams;
35-
import redis.clients.jedis.params.ZAddParams;
36-
import redis.clients.jedis.params.ZIncrByParams;
37-
import redis.clients.jedis.params.LPosParams;
29+
import redis.clients.jedis.params.*;
3830
import redis.clients.jedis.util.SafeEncoder;
3931

4032
public class BinaryClient extends Connection {
@@ -1457,10 +1449,28 @@ public void xread(final int count, final long block, final Map<byte[], byte[]> s
14571449
params[streamsIndex++] = entry.getKey();
14581450
params[idsIndex++] = entry.getValue();
14591451
}
1460-
1452+
14611453
sendCommand(XREAD, params);
1462-
}
1463-
1454+
}
1455+
1456+
public void xread(final XReadParams params, final Entry<byte[], byte[]>... streams) {
1457+
final byte[][] bparams = params.getByteParams();
1458+
final int paramLength = bparams.length;
1459+
1460+
final byte[][] args = new byte[paramLength + 1 + streams.length * 2][];
1461+
System.arraycopy(bparams, 0, args, 0, paramLength);
1462+
1463+
args[paramLength] = Keyword.STREAMS.raw;
1464+
int keyIndex = paramLength + 1;
1465+
int idsIndex = keyIndex + streams.length;
1466+
for (final Entry<byte[], byte[]> entry : streams) {
1467+
args[keyIndex++] = entry.getKey();
1468+
args[idsIndex++] = entry.getValue();
1469+
}
1470+
1471+
sendCommand(XREAD, args);
1472+
}
1473+
14641474
public void xack(final byte[] key, final byte[] group, final byte[]... ids) {
14651475
final byte[][] params = new byte[2 + ids.length][];
14661476
int index = 0;
@@ -1552,7 +1562,29 @@ public void xreadGroup(byte[] groupname, byte[] consumer, int count, long block,
15521562
sendCommand(XREADGROUP, params);
15531563
}
15541564

1555-
1565+
public void xreadGroup(byte[] groupname, byte[] consumer, final XReadGroupParams params, final Entry<byte[], byte[]>... streams) {
1566+
final byte[][] bparams = params.getByteParams();
1567+
final int paramLength = bparams.length;
1568+
1569+
final byte[][] args = new byte[3 + paramLength + 1 + streams.length * 2][];
1570+
int index = 0;
1571+
args[index++] = Keyword.GROUP.raw;
1572+
args[index++] = groupname;
1573+
args[index++] = consumer;
1574+
System.arraycopy(bparams, 0, args, index, paramLength);
1575+
index += paramLength;
1576+
1577+
args[index++] = Keyword.STREAMS.raw;
1578+
int keyIndex = index;
1579+
int idsIndex = keyIndex + streams.length;
1580+
for (final Entry<byte[], byte[]> entry : streams) {
1581+
args[keyIndex++] = entry.getKey();
1582+
args[idsIndex++] = entry.getValue();
1583+
}
1584+
1585+
sendCommand(XREADGROUP, args);
1586+
}
1587+
15561588
public void xpending(byte[] key, byte[] groupname, byte[] start, byte[] end, int count, byte[] consumername) {
15571589
if(consumername == null) {
15581590
sendCommand(XPENDING, key, groupname, start, end, toByteArray(count));

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

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.LinkedHashSet;
1515
import java.util.List;
1616
import java.util.Map;
17+
import java.util.Map.Entry;
1718
import java.util.Set;
1819

1920
import javax.net.ssl.HostnameVerifier;
@@ -29,14 +30,7 @@
2930
import redis.clients.jedis.exceptions.InvalidURIException;
3031
import redis.clients.jedis.exceptions.JedisDataException;
3132
import redis.clients.jedis.exceptions.JedisException;
32-
import redis.clients.jedis.params.ClientKillParams;
33-
import redis.clients.jedis.params.GeoRadiusParam;
34-
import redis.clients.jedis.params.GeoRadiusStoreParam;
35-
import redis.clients.jedis.params.MigrateParams;
36-
import redis.clients.jedis.params.SetParams;
37-
import redis.clients.jedis.params.ZAddParams;
38-
import redis.clients.jedis.params.ZIncrByParams;
39-
import redis.clients.jedis.params.LPosParams;
33+
import redis.clients.jedis.params.*;
4034
import redis.clients.jedis.util.JedisByteHashMap;
4135
import redis.clients.jedis.util.JedisURIHelper;
4236

@@ -4247,6 +4241,23 @@ public List<byte[]> xread(int count, long block, Map<byte[], byte[]> streams) {
42474241
}
42484242
}
42494243

4244+
@Override
4245+
public List<byte[]> xread(XReadParams xReadParams, Entry<byte[], byte[]>... streams) {
4246+
checkIsInMultiOrPipeline();
4247+
client.xread(xReadParams, streams);
4248+
4249+
if (!xReadParams.hasBlock()) {
4250+
return client.getBinaryMultiBulkReply();
4251+
}
4252+
4253+
client.setTimeoutInfinite();
4254+
try {
4255+
return client.getBinaryMultiBulkReply();
4256+
} finally {
4257+
client.rollbackTimeout();
4258+
}
4259+
}
4260+
42504261
@Override
42514262
public List<byte[]> xreadGroup(byte[] groupname, byte[] consumer, int count, long block, boolean noAck,
42524263
Map<byte[], byte[]> streams) {
@@ -4260,6 +4271,24 @@ public List<byte[]> xreadGroup(byte[] groupname, byte[] consumer, int count, lon
42604271
}
42614272
}
42624273

4274+
@Override
4275+
public List<byte[]> xreadGroup(byte[] groupname, byte[] consumer, XReadGroupParams xReadGroupParams,
4276+
Entry<byte[], byte[]>... streams) {
4277+
checkIsInMultiOrPipeline();
4278+
client.xreadGroup(groupname, consumer, xReadGroupParams, streams);
4279+
4280+
if (!xReadGroupParams.hasBlock()) {
4281+
return client.getBinaryMultiBulkReply();
4282+
}
4283+
4284+
client.setTimeoutInfinite();
4285+
try {
4286+
return client.getBinaryMultiBulkReply();
4287+
} finally {
4288+
client.rollbackTimeout();
4289+
}
4290+
}
4291+
42634292
@Override
42644293
public byte[] xadd(byte[] key, byte[] id, Map<byte[], byte[]> hash, long maxLen, boolean approximateLength) {
42654294
checkIsInMultiOrPipeline();

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

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,15 @@
44
import redis.clients.jedis.commands.JedisClusterBinaryScriptingCommands;
55
import redis.clients.jedis.commands.MultiKeyBinaryJedisClusterCommands;
66
import redis.clients.jedis.commands.ProtocolCommand;
7-
import redis.clients.jedis.params.GeoRadiusParam;
8-
import redis.clients.jedis.params.GeoRadiusStoreParam;
9-
import redis.clients.jedis.params.SetParams;
10-
import redis.clients.jedis.params.ZAddParams;
11-
import redis.clients.jedis.params.ZIncrByParams;
12-
import redis.clients.jedis.params.LPosParams;
7+
import redis.clients.jedis.params.*;
138
import redis.clients.jedis.util.JedisClusterHashTagUtil;
149
import redis.clients.jedis.util.KeyMergeUtil;
1510
import redis.clients.jedis.util.SafeEncoder;
1611

1712
import java.io.Closeable;
1813
import java.util.List;
1914
import java.util.Map;
15+
import java.util.Map.Entry;
2016
import java.util.Set;
2117
import javax.net.ssl.HostnameVerifier;
2218
import javax.net.ssl.SSLParameters;
@@ -2243,6 +2239,16 @@ public List<byte[]> execute(Jedis connection) {
22432239
}.runBinary(keys.length, keys);
22442240
}
22452241

2242+
@Override
2243+
public List<byte[]> xread(final XReadParams xReadParams, final Entry<byte[], byte[]>... streams) {
2244+
return new JedisClusterCommand<List<byte[]>>(connectionHandler, maxAttempts) {
2245+
@Override
2246+
public List<byte[]> execute(Jedis connection) {
2247+
return connection.xread(xReadParams, streams);
2248+
}
2249+
}.runBinary(streams.length, getKeys(streams));
2250+
}
2251+
22462252
@Override
22472253
public Long xack(final byte[] key, final byte[] group, final byte[]... ids) {
22482254
return new JedisClusterCommand<Long>(connectionHandler, maxAttempts) {
@@ -2307,6 +2313,17 @@ public List<byte[]> execute(Jedis connection) {
23072313
}.runBinary(keys.length, keys);
23082314
}
23092315

2316+
@Override
2317+
public List<byte[]> xreadGroup(final byte[] groupname, final byte[] consumer, final XReadGroupParams xReadGroupParams,
2318+
final Entry<byte[], byte[]>... streams) {
2319+
return new JedisClusterCommand<List<byte[]>>(connectionHandler, maxAttempts) {
2320+
@Override
2321+
public List<byte[]> execute(Jedis connection) {
2322+
return connection.xreadGroup(groupname, consumer, xReadGroupParams, streams);
2323+
}
2324+
}.runBinary(streams.length, getKeys(streams));
2325+
}
2326+
23102327
@Override
23112328
public Long xdel(final byte[] key, final byte[]... ids) {
23122329
return new JedisClusterCommand<Long>(connectionHandler, maxAttempts) {
@@ -2367,4 +2384,12 @@ public Object execute(Jedis connection){
23672384
}
23682385
}.runBinary(sampleKey);
23692386
}
2387+
2388+
private static byte[][] getKeys(final Entry<byte[], ?>... entries) {
2389+
byte[][] keys = new byte[entries.length][];
2390+
for (int i = 0; i < entries.length; i++) {
2391+
keys[i] = entries[i].getKey();
2392+
}
2393+
return keys;
2394+
}
23702395
}

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package redis.clients.jedis;
22

3+
import java.util.AbstractMap;
34
import java.util.ArrayList;
45
import java.util.HashMap;
56
import java.util.HashSet;
@@ -643,7 +644,32 @@ public String toString() {
643644
return "StreamEntryID";
644645
}
645646
};
646-
647+
648+
public static final Builder<List<Map.Entry<String, List<StreamEntry>>>> STREAM_READ_RESPONSE
649+
= new Builder<List<Map.Entry<String, List<StreamEntry>>>>() {
650+
@Override
651+
public List<Map.Entry<String, List<StreamEntry>>> build(Object data) {
652+
if (data == null) {
653+
return null;
654+
}
655+
List<Object> streams = (List<Object>) data;
656+
657+
List<Map.Entry<String, List<StreamEntry>>> result = new ArrayList<>(streams.size());
658+
for (Object streamObj : streams) {
659+
List<Object> stream = (List<Object>) streamObj;
660+
String streamId = SafeEncoder.encode((byte[]) stream.get(0));
661+
List<StreamEntry> streamEntries = BuilderFactory.STREAM_ENTRY_LIST.build(stream.get(1));
662+
result.add(new AbstractMap.SimpleEntry<>(streamId, streamEntries));
663+
}
664+
665+
return result;
666+
}
667+
668+
@Override
669+
public String toString() {
670+
return "List<Entry<String, List<StreamEntry>>>";
671+
}
672+
};
647673

648674
public static final Builder<List<StreamEntry>> STREAM_ENTRY_LIST = new Builder<List<StreamEntry>>() {
649675
@Override

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

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,7 @@
1414
import javax.net.ssl.SSLSocketFactory;
1515

1616
import redis.clients.jedis.commands.Commands;
17-
import redis.clients.jedis.params.GeoRadiusParam;
18-
import redis.clients.jedis.params.GeoRadiusStoreParam;
19-
import redis.clients.jedis.params.MigrateParams;
20-
import redis.clients.jedis.params.SetParams;
21-
import redis.clients.jedis.params.ZAddParams;
22-
import redis.clients.jedis.params.ZIncrByParams;
23-
import redis.clients.jedis.params.LPosParams;
17+
import redis.clients.jedis.params.*;
2418
import redis.clients.jedis.util.SafeEncoder;
2519

2620
public class Client extends BinaryClient implements Commands {
@@ -1292,7 +1286,26 @@ public void xread(final int count, final long block, final Entry<String, StreamE
12921286
}
12931287
xread(count, block, bhash);
12941288
}
1295-
1289+
1290+
@Override
1291+
public void xread(final XReadParams params, final Map<String, StreamEntryID> streams) {
1292+
final byte[][] bparams = params.getByteParams();
1293+
final int paramLength = bparams.length;
1294+
1295+
final byte[][] args = new byte[paramLength + 1 + streams.size() * 2][];
1296+
System.arraycopy(bparams, 0, args, 0, paramLength);
1297+
1298+
args[paramLength] = Protocol.Keyword.STREAMS.raw;
1299+
int keyIndex = paramLength + 1;
1300+
int idsIndex = keyIndex + streams.size();
1301+
for (Entry<String, StreamEntryID> entry : streams.entrySet()) {
1302+
args[keyIndex++] = SafeEncoder.encode(entry.getKey());
1303+
args[idsIndex++] = SafeEncoder.encode(entry.getValue().toString());
1304+
}
1305+
1306+
sendCommand(Protocol.Command.XREAD, args);
1307+
}
1308+
12961309
@Override
12971310
public void xack(final String key, final String group, final StreamEntryID... ids) {
12981311
final byte[][] bids = new byte[ids.length][];
@@ -1347,6 +1360,30 @@ public void xreadGroup(String groupname, String consumer, int count, long block,
13471360
xreadGroup(SafeEncoder.encode(groupname), SafeEncoder.encode(consumer), count, block, noAck, bhash);
13481361
}
13491362

1363+
@Override
1364+
public void xreadGroup(String groupname, String consumer, XReadGroupParams params, Map<String, StreamEntryID> streams) {
1365+
final byte[][] bparams = params.getByteParams();
1366+
final int paramLength = bparams.length;
1367+
1368+
final byte[][] args = new byte[3 + paramLength + 1 + streams.size() * 2][];
1369+
int index = 0;
1370+
args[index++] = Protocol.Keyword.GROUP.raw;
1371+
args[index++] = SafeEncoder.encode(groupname);
1372+
args[index++] = SafeEncoder.encode(consumer);
1373+
System.arraycopy(bparams, 0, args, index, paramLength);
1374+
index += paramLength;
1375+
1376+
args[index++] = Protocol.Keyword.STREAMS.raw;
1377+
int keyIndex = index;
1378+
int idsIndex = keyIndex + streams.size();
1379+
for (Entry<String, StreamEntryID> entry : streams.entrySet()) {
1380+
args[keyIndex++] = SafeEncoder.encode(entry.getKey());
1381+
args[idsIndex++] = SafeEncoder.encode(entry.getValue().toString());
1382+
}
1383+
1384+
sendCommand(Protocol.Command.XREADGROUP, args);
1385+
}
1386+
13501387
@Override
13511388
public void xpending(String key, String groupname, StreamEntryID start, StreamEntryID end, int count, String consumername) {
13521389
xpending(SafeEncoder.encode(key), SafeEncoder.encode(groupname), SafeEncoder.encode(start==null ? "-" : start.toString()),
@@ -1384,5 +1421,5 @@ public void xinfoConsumers(String key, String group) {
13841421
xinfoConsumers(SafeEncoder.encode(key),SafeEncoder.encode(group));
13851422

13861423
}
1387-
1424+
13881425
}

0 commit comments

Comments
 (0)