我一直在干扰Cassandra的(v 2.2.4)线程池执行器(即SEPExecutor.java模块),并尝试更改用于存储挂起读取的队列(没有立即可用的工作服务器)。默认情况下,Cassandra使用ConcurrentLinkedQueue(这是一种非阻塞队列变体)。我目前正尝试使用MultiQueue设置覆盖它,以便按非FIFO顺序安排请求。
为了简单起见,我们假设我的MultiQueue实现是AbstractQueue的扩展,它简单地覆盖了offer和poll函数,并随机(de)将请求排队到任何封闭的ConcurrentLinkedQueues。对于轮询,如果一个队列返回null,我们基本上会继续遍历所有队列,直到找到非null元素(否则我们返回null)。由于我的目的是利用所包含的ConcurrentLinkedQueues(非阻塞)的属性,因此没有锁定机制。
主要的问题是,我似乎遇到了某种竞争条件,其中一些被指派的工作人员无法轮询一个据称存在于队列中的项目。换句话说,MultiQueue结构似乎是不可线性化的。更具体地说,我在这一行遇到了NullPointerException:SEPWorker.java [line 105]
有关可能导致此问题的任何线索,或者我应该如何在MultiQueue设置中维护单个ConcurrentLinkedQueue的属性?