【JAVA】系统中关于自定义比例选择的功能实现

这里以我做的系统案例来说,这是一套短信系统,客户端就扔一个号码和短信内容过来,服务端需要首先根据配置判断是否区分运营商,然后根据号段走不同的运营商网关去提交短信


sourceId表示接入系统的唯一标识ID,如果不区分的,走下面紫色的三条线,服务端为该接入方配置了三个三网(不区分运营商)网关,并且配置了不同的比例,意思就是60%请求走gw1出去,20%走gw2出去,那么gw3虽然配置了,但是给的比例是0,那么剩下的20%就是丢弃了;同样区分的话,走上面的情况,首先根据号段数据找到对应的运营商,去该运营商配置的网关,按照比例下发;

List<GwRouterInfo> gwChoose = new ArrayList<GwRouterInfo>(Collections.nCopies(100,
					gwNull));
首先初始化一个长度100的list,里面的元素都是空元素,gwNull是GwRouterInfo对象,里面的属性设置空

GwRouterInfo gwNull = new GwRouterInfo();
			gwNull.setGwId(0L);


int index = 0;
			for (int i = 0; i < size; i++) {
				GwRouterInfo gri = griList.get(i);
				for (int j = index; j < index + gri.getRatio(); j++) {
					gwChoose.add(j, gri);
				}
				index = gri.getRatio();
			}
这里size就是每组的大小,比如上面不区分运营商的是gw1,gw2,gw3,那么这个size就是3

这里的循环就将gwChoose的list给设置好了,按照预定的比例,在list的各个位置设置好值,20%的那么list里必然有20个位置的值是该网关对象,其它类似;

int gwIndex = Utils.random(100);
			GwRouterInfo gw = gwChoose.get(gwIndex);
			if (gw.getGwId() == 0L) {
				return null;
			}
			return gw;

后面就是产生一个0-100的随机数了,根据该随机下标去取list中对应的元素,就得到了该网关,当然这种场景,数据量越大,比例越准确。


以上这种方法实现该功能是最常用简单的;

核心就是各项比例以及每种比例对应的值,通过一个数组或列表按照比例给各项赋值,最终产生一个随机下标拿到该对象即可。



猜你喜欢

转载自blog.csdn.net/chiweitree/article/details/68924337