All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.leancloud.session.PersistentQueue Maven / Gradle / Ivy

There is a newer version: 8.2.28
Show newest version
package cn.leancloud.session;

import cn.leancloud.cache.SystemSetting;
import cn.leancloud.core.AppConfiguration;
import cn.leancloud.utils.StringUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class PersistentQueue implements Queue {
  Queue messages;
  private final String queueKey;
  private static final String MESSAGE_ZONE = "com.avoscloud.chat.message";
  private static final String QUEUE_KEY = "com.avoscloud.chat.message.queue";
  private final Class type;

  public PersistentQueue(String peerId, Class clazz) {
    messages = new ConcurrentLinkedQueue<>();
    this.type = clazz;
    queueKey = QUEUE_KEY + "." + peerId;
    LinkedList storedMessages = restoreMessageQueue();
    if (null != storedMessages && !storedMessages.isEmpty()) {
      messages.addAll(storedMessages);
    }
  }

  @Override
  public boolean addAll(Collection collection) {
    boolean result = messages.addAll(collection);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public void clear() {
    messages.clear();
    this.storeMessageQueue();
  }

  @Override
  public boolean contains(Object object) {
    return messages.contains(object);
  }

  @Override
  public boolean containsAll(Collection collection) {
    return messages.containsAll(collection);
  }

  @Override
  public boolean isEmpty() {
    return messages.isEmpty();
  }

  @Override
  public Iterator iterator() {
    return messages.iterator();
  }

  @Override
  public boolean remove(Object object) {
    boolean result = messages.remove(object);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public boolean removeAll(Collection collection) {
    boolean result = messages.removeAll(collection);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public boolean retainAll(Collection collection) {
    boolean result = messages.retainAll(collection);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public int size() {
    return messages.size();
  }

  @Override
  public Object[] toArray() {
    return messages.toArray();
  }

  @Override
  public  T[] toArray(T[] array) {
    return messages.toArray(array);
  }

  @Override
  public boolean add(E e) {
    boolean result = messages.add(e);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public boolean offer(E e) {
    boolean result = messages.offer(e);
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E remove() {
    E result = messages.remove();
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E poll() {
    E result = messages.poll();
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E element() {
    E result = messages.element();
    this.storeMessageQueue();
    return result;
  }

  @Override
  public E peek() {
    return messages.peek();
  }

  private void storeMessageQueue() {
    // 异步序列化,保证效率
    String queueString =
            JSON.toJSONString(messages, SerializerFeature.SkipTransientField,
                    SerializerFeature.WriteClassName, SerializerFeature.QuoteFieldNames,
                    SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullBooleanAsFalse);
    AppConfiguration.getDefaultSetting().saveString(MESSAGE_ZONE, queueKey, queueString);
  }

  private synchronized LinkedList restoreMessageQueue() {
    LinkedList storedMessages = new LinkedList();
    SystemSetting setting = AppConfiguration.getDefaultSetting();
    String queueString = setting.getString(MESSAGE_ZONE, queueKey, null);
    if (!StringUtil.isEmpty(queueString)) {
      try {
        storedMessages.addAll(JSON.parseArray(queueString, type));
      } catch (Exception e) {
        // clean it since there's parse exception
        setting.removeKey(MESSAGE_ZONE, queueKey);
      }
    }
    return storedMessages;
  }
  public interface HasId {
    String getId();
    void setId(String id);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy