public class SizeBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E> {
private final BlockingQueue<E> queue;//包含了一个直正的java队列
private final int capacity;//最大限制,缺省应该是200个,即"queue_size"
private final AtomicInteger size = new AtomicInteger();
@Override
public int size() {
return size.get();
}
3 个回复
Charele - Cisco4321
赞同来自: dadaball
queue 就是当前队列中的元素个数
queue_size,就是队列中的元数个数的最大限制
你上面说的,按理来说,是应该“queue 應該是 <= queue_size“
拿write池来说,这个队列的类型不是java的,而是es自定义的queue类型:SizeBlockingQueue
public class SizeBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E> {
private final BlockingQueue<E> queue;//包含了一个直正的java队列
private final int capacity;//最大限制,缺省应该是200个,即"queue_size"
private final AtomicInteger size = new AtomicInteger();
@Override
public int size() {
return size.get();
}
"queue"的显示结果就是那个size()方法里取到的,它返回的不是实际内部队列queue的size(),
而是用另个一个计数器size来计算的。
在真正插入或取出的时候,这个计数器也会增加或减少。
我想原因是可能是它没有考虑到某些环境下,出现的计数错误吧。
(我这里没有真实的es环境,看不到你那种状况)不过这只是个计数,就是有出入,也无关大碍。
只是个人看法,希望别人有别的看法:-)
xiaoyanghapi - Elasticsearch 爱好者
赞同来自:
Charele - Cisco4321
赞同来自:
就拿write来说吧,
看代码:
builders.put(Names.WRITE, new FixedExecutorBuilder(settings, Names.WRITE, availableProcessors, 200));
它是固定类型的池(ES里面分3种,这是另外的话题)
其中的availableProcessors就是你的cpu核心数(如果你不另外设置的话)
比如我的电脑是12线程的,它会建立12个线程为你的write服务,
如果你的write请求太多,超过了12个,它就会把多余请求放到队列里面等,等有线程空闲了再为它们服务,
如果你的write请求太多太多了,超过了200个,队列都放不下了,它就会reject报错。