Disruptor (4)

一世执手 提交于 2019-11-28 16:56:23

Disruptor.shutdown 方法阻塞至所有事件得到处理。
循环调用hasBacklog()判定当前 生产分配的游标: ringBuffer.getCursor()  > 消费者序号: consumer的lastSequence,表示还未处理完结。

    public void shutdown(final long timeout, final TimeUnit timeUnit) throws TimeoutException
    {
        final long timeOutAt = System.currentTimeMillis() + timeUnit.toMillis(timeout);
        while (hasBacklog())
        {
            if (timeout >= 0 && System.currentTimeMillis() > timeOutAt)
            {
                throw TimeoutException.INSTANCE;
            }
            // Busy spin
            try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
        halt();
    }

    private boolean hasBacklog()
    {
        final long cursor = ringBuffer.getCursor();
        for (final Sequence consumer : consumerRepository.getLastSequenceInChain(false))
        {
         System.out.println(DateTimeFormatter.ISO_INSTANT.format(Instant.now()) + "  " + "cursor=:"+ cursor +"consumer:"+ consumer.get());

            if (cursor > consumer.get())
            {
                return true;
            }
        }
        return false;
    }

准确的说:
hasBacklog只是比对瞬时状态下的是否处理完当前已入RingBuffer的事件。
高并发时大量事件阻塞置入RingBuffer时,当消费效率大于生产效率时,可能并不是理想中下的所有事件得到处理,慎用


测试用例:

  1. 不阻塞消费者, 此时处理到第4个接直接shutdown了。
  2. 消费者sleep(100),  发现: 会一直往下处理。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!