⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 throughputcontrol.java

📁 POS is a Java&#174 platform-based, mission-critical, ISO-8583 based financial transaction library/fr
💻 JAVA
字号:
/* * jPOS Project [http://jpos.org] * Copyright (C) 2000-2008 Alejandro P. Revilla * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program.  If not, see <http://www.gnu.org/licenses/>. */package org.jpos.util;/** * ThroughputControl can be used to limit the throughput  * of a system to a maximum number of transactions in  * a given period of time. */public class ThroughputControl {    private int[] period;    private int[] max;    private int[] cnt;    private long[] start;    private long[] sleep;    /**     * @param maxTransactions ditto     * @param periodInMillis ditto     */    public ThroughputControl (int maxTransactions, int periodInMillis) {        this (new int[] { maxTransactions },              new int[] { periodInMillis });    }    /**     * @param maxTransactions ditto     * @param periodInMillis ditto     */    public ThroughputControl (int[] maxTransactions, int[] periodInMillis) {        super();        int l = maxTransactions.length;        period = new int[l];        max = new int[l];        cnt = new int[l];        start = new long[l];        sleep = new long[l];        for (int i=0; i<l; i++) {            this.max[i]    = maxTransactions[i];            this.period[i] = periodInMillis[i];            this.sleep[i]  = Math.min(Math.max (periodInMillis[i]/10, 500L),50L);;            this.start[i]  = System.currentTimeMillis();        }    }    /**     * control should be called on every transaction.     * it may sleep for a while in order to control the system throughput     *      * @return aprox sleep time or zero if no sleep     */    public long control() {        boolean delayed = false;        long init = System.currentTimeMillis();        for (int i=0; i<cnt.length; i++) {            synchronized (this) {                cnt[i]++;            }            do {                if (cnt[i] > max[i]) {                    delayed = true;                    try {                         Thread.sleep (sleep[i]);                     } catch (InterruptedException e) { }                }                synchronized (this) {                    long now = System.currentTimeMillis();                    if (now - start[i] > period[i]) {                        long elapsed = now - start[i];                        int  allowed = (int) ((elapsed * max[i]) / period[i]);                        start[i] = now;                        cnt[i] = Math.max (cnt[i] - allowed, 0);                    }                }            } while (cnt[i] > max[i]);        }        return delayed ? (System.currentTimeMillis() - init) : 0L;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -