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 @ 2022-11-17 11:27  意犹未尽  阅读(48)  评论(0编辑  收藏  举报