You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					117 lines
				
				3.7 KiB
			
		
		
			
		
	
	
					117 lines
				
				3.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								package com.ynxbd.common.helper.redis;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import redis.clients.jedis.Jedis;
							 | 
						||
| 
								 | 
							
								import redis.clients.jedis.JedisPool;
							 | 
						||
| 
								 | 
							
								import redis.clients.jedis.JedisPoolConfig;
							 | 
						||
| 
								 | 
							
								import redis.clients.jedis.StreamEntryID;
							 | 
						||
| 
								 | 
							
								import redis.clients.jedis.params.XReadGroupParams;
							 | 
						||
| 
								 | 
							
								import redis.clients.jedis.resps.StreamEntry;
							 | 
						||
| 
								 | 
							
								import redis.clients.jedis.resps.StreamGroupInfo;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import java.util.HashMap;
							 | 
						||
| 
								 | 
							
								import java.util.List;
							 | 
						||
| 
								 | 
							
								import java.util.Map;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public class RedisStreamHelper {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static void main(String[] args) {
							 | 
						||
| 
								 | 
							
								        Jedis jedis = new Jedis();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private static JedisPool jedisPool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static void initPool() {
							 | 
						||
| 
								 | 
							
								//        JedisPoolConfig poolConfig = new JedisPoolConfig();
							 | 
						||
| 
								 | 
							
								//        poolConfig.setMaxTotal(100);
							 | 
						||
| 
								 | 
							
								//        poolConfig.setMaxIdle(10);
							 | 
						||
| 
								 | 
							
								//        jedisPool = new JedisPool(poolConfig, host, port, timeout, password);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //将数据传入stream
							 | 
						||
| 
								 | 
							
								    public StreamEntryID setStream(String key, Map<String, String> content) {
							 | 
						||
| 
								 | 
							
								        try (Jedis jedis = jedisPool.getResource()) {
							 | 
						||
| 
								 | 
							
								            StreamEntryID id = jedis.xadd("key", StreamEntryID.NEW_ENTRY, content);
							 | 
						||
| 
								 | 
							
								            String resp = id.toString();
							 | 
						||
| 
								 | 
							
								            System.out.println(resp);
							 | 
						||
| 
								 | 
							
								            return id;
							 | 
						||
| 
								 | 
							
								        } catch (Exception e) {
							 | 
						||
| 
								 | 
							
								            e.printStackTrace();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 创建消费者群组
							 | 
						||
| 
								 | 
							
								    public void createConsumeGroup(String key, String groupName, String lastId) {
							 | 
						||
| 
								 | 
							
								        try (Jedis jedis = jedisPool.getResource()) {
							 | 
						||
| 
								 | 
							
								            StreamEntryID id;
							 | 
						||
| 
								 | 
							
								            if (lastId == null) {
							 | 
						||
| 
								 | 
							
								                lastId = "0-0";
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            id = new StreamEntryID(lastId);
							 | 
						||
| 
								 | 
							
								            // 没用消费者时是否自动创建,如果有,在创建会异常
							 | 
						||
| 
								 | 
							
								            String resp = jedis.xgroupCreate(key, groupName, id, false);
							 | 
						||
| 
								 | 
							
								            System.out.println(resp);
							 | 
						||
| 
								 | 
							
								        } catch (Exception e) {
							 | 
						||
| 
								 | 
							
								            e.printStackTrace();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 消费者消费
							 | 
						||
| 
								 | 
							
								    public StreamEntryID consume(String key, String groupName, String consumeName, String lastId) {
							 | 
						||
| 
								 | 
							
								        try (Jedis jedis = jedisPool.getResource()) {
							 | 
						||
| 
								 | 
							
								            /*
							 | 
						||
| 
								 | 
							
								              COUNT 最多读取多少条消息
							 | 
						||
| 
								 | 
							
								              BLOCK 是否已阻塞的方式读取消息,默认不阻塞,如果milliseconds设置为0,表示永远阻塞
							 | 
						||
| 
								 | 
							
								             */
							 | 
						||
| 
								 | 
							
								            XReadGroupParams xReadGroupParams = new XReadGroupParams().block(0).count(1);
							 | 
						||
| 
								 | 
							
								            Map<String, StreamEntryID> streams = new HashMap<>();
							 | 
						||
| 
								 | 
							
								            streams.put(key, StreamEntryID.UNRECEIVED_ENTRY); // >
							 | 
						||
| 
								 | 
							
								            List<Map.Entry<String, List<StreamEntry>>>
							 | 
						||
| 
								 | 
							
								                    entries = jedis.xreadGroup(groupName, consumeName, xReadGroupParams, streams);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            System.out.println(entries);
							 | 
						||
| 
								 | 
							
								        } catch (Exception e) {
							 | 
						||
| 
								 | 
							
								            e.printStackTrace();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 消息确认
							 | 
						||
| 
								 | 
							
								    public void ackMsg(String key, String groupName,StreamEntryID streamEntryID) {
							 | 
						||
| 
								 | 
							
								        if (streamEntryID == null) {
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        try (Jedis jedis = jedisPool.getResource()) {
							 | 
						||
| 
								 | 
							
								            jedis.xack(key, groupName, streamEntryID);
							 | 
						||
| 
								 | 
							
								        } catch (Exception e) {
							 | 
						||
| 
								 | 
							
								            e.printStackTrace();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 检查消费者组是否存在
							 | 
						||
| 
								 | 
							
								    public boolean checkGroup(String key, String groupName) {
							 | 
						||
| 
								 | 
							
								        try (Jedis jedis = jedisPool.getResource()) {
							 | 
						||
| 
								 | 
							
								            List<StreamGroupInfo> groupInfos = jedis.xinfoGroups(key);
							 | 
						||
| 
								 | 
							
								            for (StreamGroupInfo item : groupInfos) {
							 | 
						||
| 
								 | 
							
								                if (item.getName().equals(groupName)) {
							 | 
						||
| 
								 | 
							
								                    return true;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } catch (Exception e) {
							 | 
						||
| 
								 | 
							
								            e.printStackTrace();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |