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());
        }
    }
复制代码

 

posted @   意犹未尽  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2020-11-17 spring源码阅读(四)-Spring AOP源码阅读
2020-11-17 spring源码阅读(三)-Spring AOP用法和理解
2016-11-17 数据库三大范式
点击右上角即可分享
微信分享提示