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

com.github.ltsopensource.jobclient.support.JobSubmitProtector Maven / Gradle / Ivy

package com.github.ltsopensource.jobclient.support;

import com.github.ltsopensource.core.commons.concurrent.limiter.RateLimiter;
import com.github.ltsopensource.core.constant.Constants;
import com.github.ltsopensource.core.constant.ExtConfig;
import com.github.ltsopensource.core.domain.Job;
import com.github.ltsopensource.core.exception.JobSubmitException;
import com.github.ltsopensource.jobclient.domain.JobClientAppContext;
import com.github.ltsopensource.jobclient.domain.Response;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 用来处理客户端请求过载问题
 *
 * @author Robert HG ([email protected]) on 5/21/15.
 */
public class JobSubmitProtector {

    private int maxQPS;
    // 用信号量进行过载保护
    RateLimiter rateLimiter;
    private int acquireTimeout = 100;
    private String errorMsg;

    public JobSubmitProtector(JobClientAppContext appContext) {

        this.maxQPS = appContext.getConfig().getParameter(ExtConfig.JOB_SUBMIT_MAX_QPS,
                Constants.DEFAULT_JOB_SUBMIT_MAX_QPS);
        if (this.maxQPS < 10) {
            this.maxQPS = Constants.DEFAULT_JOB_SUBMIT_MAX_QPS;
        }

        this.errorMsg = "the maxQPS is " + maxQPS +
                " , submit too fast , use " + ExtConfig.JOB_SUBMIT_MAX_QPS +
                " can change the concurrent size .";
        this.acquireTimeout = appContext.getConfig().getParameter(ExtConfig.JOB_SUBMIT_LOCK_ACQUIRE_TIMEOUT, 100);

        this.rateLimiter = RateLimiter.create(this.maxQPS);
    }

    public Response execute(final List jobs, final JobSubmitExecutor jobSubmitExecutor) throws JobSubmitException {
        if (!rateLimiter.tryAcquire(acquireTimeout, TimeUnit.MILLISECONDS)) {
            throw new JobSubmitProtectException(maxQPS, errorMsg);
        }
        return jobSubmitExecutor.execute(jobs);
    }

    public int getMaxQPS() {
        return maxQPS;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy