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

ru.taskurotta.service.hz.config.HzActorConfigManager Maven / Gradle / Ivy

The newest version!
package ru.taskurotta.service.hz.config;

import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IExecutorService;
import com.hazelcast.core.IMap;
import com.hazelcast.core.Member;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.taskurotta.service.config.model.ActorPreferences;
import ru.taskurotta.service.console.manager.ActorConfigManager;
import ru.taskurotta.service.console.model.ActorVO;
import ru.taskurotta.service.console.model.GenericPage;
import ru.taskurotta.service.console.model.MetricsStatDataVO;
import ru.taskurotta.service.console.retriever.metrics.MetricsMethodDataRetriever;
import ru.taskurotta.service.metrics.MetricName;
import ru.taskurotta.service.metrics.model.QueueBalanceVO;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * Implementation of ActorConfigManager for Hazelcast.
 * Addresses hazelcast map for actors preferences
 *
 * Date: 27.09.13 18:03
 */
public class HzActorConfigManager implements ActorConfigManager {

    private static final Logger logger = LoggerFactory.getLogger(HzActorConfigManager.class);
    public static final String ACTOR_CONFIG_EXECUTOR_SERVICE = "actorConfigExecutorService";

    protected String actorConfigName;
    protected HazelcastInstance hzInstance;
    protected MetricsMethodDataRetriever metricsDataRetriever;

    public HzActorConfigManager(HazelcastInstance hzInstance, String actorConfigName) {
        this.hzInstance = hzInstance;
        this.actorConfigName = actorConfigName;
    }

    @Override
    public GenericPage getActorList(int pageNum, int pageSize) {
        GenericPage result = null;
        IMap actorsPrefs = hzInstance.getMap(actorConfigName);
        List allPreferences = new ArrayList(actorsPrefs.values());

        if (allPreferences != null && !allPreferences.isEmpty()) {
            int fromIndex = (pageNum - 1) * pageSize;
            int toIndex = Math.min(pageSize * pageNum, allPreferences.size());
            List subList = allPreferences.subList(fromIndex, toIndex);
            List pageItems = new ArrayList<>();
            for (ActorPreferences ap : subList) {
                ActorVO actorVO = new ActorVO();
                actorVO.setId(ap.getId());
                actorVO.setBlocked(ap.isBlocked());
                actorVO.setQueueName(ap.getQueueName());
                if (metricsDataRetriever!=null) {
                    actorVO.setLastPoll(metricsDataRetriever.getLastActivityTime(MetricName.POLL.getValue(), ap.getId()));
                    actorVO.setLastRelease(metricsDataRetriever.getLastActivityTime(MetricName.RELEASE.getValue(), ap.getId()));
                }
                pageItems.add(actorVO);
            }
            result = new GenericPage(pageItems, pageNum, pageSize, allPreferences.size());
        }

        return result;
    }

    @Override
    public QueueBalanceVO getQueueState(final String queueName) {
        IExecutorService executorService = hzInstance.getExecutorService(ACTOR_CONFIG_EXECUTOR_SERVICE);

        Map > futures = executorService.submitToMembers(new ComputeQueueBalanceTask(queueName), hzInstance.getCluster().getMembers());

        QueueBalanceVO result = new QueueBalanceVO();
        for (Future future : futures.values()) {
            try {
                QueueBalanceVO nodeVal = future.get(5, TimeUnit.SECONDS);
                result = HzActorConfigUtils.sumQueueStates(result, nodeVal);
                if (nodeVal != null) {
                    result.setNodes(result.getNodes()+1);
                }
            } catch (Exception e) {
                logger.error("Cannot get queue state value for queue["+queueName+"]", e);
            }
        }
        logger.debug("Cluster wide queue state got is [{}]", result);
        return result;
    }

    @Override
    public Map> getMetricsData(Collection metrics, Collection actorIds) {
        IExecutorService executorService = hzInstance.getExecutorService(ACTOR_CONFIG_EXECUTOR_SERVICE);
        Map> result = new HashMap<>();

        Map >> futures = executorService.submitToMembers(new ComputeMetricsStatDataTask(metrics, actorIds), hzInstance.getCluster().getMembers());
        if (futures!=null && !futures.isEmpty()) {
            for (Map.Entry>> entry : futures.entrySet()) {
                try {
                    Future > future = entry.getValue();
                    result.put(entry.getKey().toString(), future.get(5, TimeUnit.SECONDS));
                } catch (Exception e) {
                    logger.error("Cannot get metrics stat data for actorIds["+actorIds+"], metrics["+metrics+"]", e);
                }
            }
        }

        return result;
    }

    public void setMetricsDataRetriever(MetricsMethodDataRetriever metricsDataRetriever) {
        this.metricsDataRetriever = metricsDataRetriever;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy