cometd-session管理
大部分场景我们的session映射都是使用userId做映射
我们可以通过map来管理
但是有时候我们需要更细分的查询,比如某一类用户,用户下的某一类session app端?web端?
可以使用以下工具类
引入包
<dependency> <groupId>com.googlecode.cqengine</groupId> <artifactId>cqengine</artifactId> <scope>provided</scope> </dependency>
1.定义索引
private final static IndexedCollection<CometdSession> _SESSIONS = new ConcurrentIndexedCollection<>(); static { // Added indexes. _SESSIONS.addIndex(NavigableIndex.onAttribute(CometdSession.USER_ID));//用户id _SESSIONS.addIndex(NavigableIndex.onAttribute(CometdSession.PLATFORM));//平台类型 app、web等 _SESSIONS.addIndex(NavigableIndex.onAttribute(CometdSession.SESSION_ID));//session id _SESSIONS.addIndex(NavigableIndex.onAttribute(CometdSession.PROVIDER_ID));//服务商 }
package com.ewei.push.session; import com.ewei.support.util.EweiJsons; import com.googlecode.cqengine.attribute.Attribute; import com.googlecode.cqengine.attribute.SimpleAttribute; import com.googlecode.cqengine.query.option.QueryOptions; import org.budo.time.Time; import java.io.Serializable; import java.sql.Timestamp; import java.util.HashMap; import java.util.Map; /** * @author lmw */ public class CometdSession implements Serializable { private static final long serialVersionUID = 7435082093445586761L; private Integer providerId; private Integer userId; private String platform; private String sessionId; private Timestamp createdAt = Time.now().toTimestamp(); private final Map<String, Object> properties = new HashMap<>(); public CometdSession() { } public CometdSession(String sessionId, Integer providerId, Integer userId, String platform) { this.sessionId = sessionId; this.providerId = providerId; this.userId = userId; this.platform = platform; } public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; } public Integer getProviderId() { return providerId; } public Integer getUserId() { return userId; } public void setProviderId(Integer providerId) { this.providerId = providerId; } public void setUserId(Integer userId) { this.userId = userId; } public Timestamp getCreatedAt() { return createdAt; } public void setCreatedAt(Timestamp createdAt) { this.createdAt = createdAt; } public String getPlatform() { return platform; } public void setPlatform(String platform) { this.platform = platform; } @Override public String toString() { return EweiJsons.toJson(this); } public void put(String key, Object value) { properties.put(key, value); } public Object get(String key) { return properties.get(key); } public static final Attribute<CometdSession, String> SESSION_ID = new SimpleAttribute<CometdSession, String>("sessionId") { @Override public String getValue(CometdSession session, QueryOptions queryOptions) { return session.getSessionId(); } }; public static final Attribute<CometdSession, String> PLATFORM = new SimpleAttribute<CometdSession, String>("platform") { @Override public String getValue(CometdSession session, QueryOptions queryOptions) { return session.getPlatform(); } }; public static final Attribute<CometdSession, Integer> USER_ID = new SimpleAttribute<CometdSession, Integer>("userId") { @Override public Integer getValue(CometdSession session, QueryOptions queryOptions) { return session.getUserId(); } }; public static final Attribute<CometdSession, Integer> PROVIDER_ID = new SimpleAttribute<CometdSession, Integer>("providerId") { @Override public Integer getValue(CometdSession session, QueryOptions queryOptions) { return session.getProviderId(); } }; }
3.新增移除就正常使用
4.查询
@SpringGraph @Override public String[] listSessionIdsByUserIdAndPlatform(Integer providerId, Integer userId, String platform) { Assert.notNull(providerId, "providerId is null"); Assert.notNull(userId, "userId is null"); // providerId = ? AND userId = ? AND platform = ? if (StringUtil.isEmpty(platform)) { return this.listSessionIdsByUserId(providerId, userId); } final Query<CometdSession> query = and(// equal(CometdSession.USER_ID, userId),// equal(CometdSession.PLATFORM, platform),// equal(CometdSession.PROVIDER_ID, providerId)); try (ResultSet<CometdSession> resultSet = _SESSIONS.retrieve(query)) { return this.toSessionIdsArray(resultSet.stream()); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2020-11-17 spring源码阅读(四)-Spring AOP源码阅读
2020-11-17 spring源码阅读(三)-Spring AOP用法和理解
2016-11-17 数据库三大范式