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

com.saucesubfresh.rpc.server.store.AbstractInstanceStore Maven / Gradle / Ivy

package com.saucesubfresh.rpc.server.store;

import com.saucesubfresh.rpc.core.enums.ClientStatus;
import com.saucesubfresh.rpc.core.information.ClientInformation;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author lijunping on 2022/2/18
 */
public abstract class AbstractInstanceStore implements InstanceStore{

    @Override
    public void put(List instances) {
        long currentTime = new Date().getTime();
        handlerOffline(instances, currentTime);
        if (!CollectionUtils.isEmpty(instances)){
            handlerOnline(instances, currentTime);
        }
    }

    /**
     * 处理客户端的上线
     * @param instances 上线的客户端列表
     */
    private void handlerOnline(List instances, long currentTime){
        instances.forEach(instance->{
            final String clientId = instance.getClientId();
            ClientInformation clientInformation = get(clientId);
            if (Objects.isNull(clientInformation) || clientInformation.getStatus() == ClientStatus.OFF_LINE){
                instance.setStatus(ClientStatus.ON_LINE);
                instance.setOnlineTime(currentTime);
                put(clientId, instance);
            }
        });
    }


    /**
     * 处理下线的客户端
     * @param instances 上线的客户端列表
     */
    private void handlerOffline(List instances, long currentTime){
        List cacheClients = getAll();
        if (CollectionUtils.isEmpty(cacheClients)){
            return;
        }

        List onlineClientIds = new ArrayList<>();
        if (CollectionUtils.isEmpty(instances)){
            onlineClientIds = instances.stream().map(ClientInformation::getClientId).collect(Collectors.toList());
        }

        List cacheClientIds = cacheClients.stream().map(ClientInformation::getClientId).collect(Collectors.toList());
        cacheClientIds.removeAll(onlineClientIds);
        cacheClientIds.forEach(clientId-> {
            ClientInformation instance = get(clientId);
            instance.setStatus(ClientStatus.OFF_LINE);
            instance.setOnlineTime(currentTime);
            put(instance.getClientId(), instance);
        });
    }

    @Override
    public List getOnlineList() {
        List clients = getAll();
        if (CollectionUtils.isEmpty(clients)){
            return Collections.emptyList();
        }
        return clients.stream().filter(e->e.getStatus() == ClientStatus.ON_LINE).collect(Collectors.toList());
    }

    protected abstract ClientInformation get(String clientId);

    protected abstract void put(String clientId, ClientInformation instance);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy