hbase thrift 访问队列
public class CallQueue implements BlockingQueue<Runnable> {
  private static Log LOG = LogFactory.getLog(CallQueue.class);
  private final BlockingQueue<Call> underlyingQueue;
  private final ThriftMetrics metrics;
  public CallQueue(BlockingQueue<Call> underlyingQueue,
                   ThriftMetrics metrics) {
    this.underlyingQueue = underlyingQueue;
    this.metrics = metrics;
  }
  private static long now() {
    return System.nanoTime();
  }
//访问线程
public static class Call implements Runnable {
    final long startTime;
    final Runnable underlyingRunnable;
    Call(Runnable underlyingRunnable) {
      this.underlyingRunnable = underlyingRunnable;
      this.startTime = now();
    }
    @Override
    public void run() {
      underlyingRunnable.run();
    }
    public long timeInQueue() {
      return now() - startTime;
    }
    @Override
    public boolean equals(Object other) {
      if (other instanceof Call) {
        Call otherCall = (Call)(other);
        return this.underlyingRunnable.equals(otherCall.underlyingRunnable);
      } else if (other instanceof Runnable) {
        return this.underlyingRunnable.equals(other);
      }
      return false;
    }
    @Override
    public int hashCode() {
      return this.underlyingRunnable.hashCode();
    }
  }
//在队列中获取默认Runnable
  @Override
  public Runnable poll() {
    Call result = underlyingQueue.poll();
    updateMetrics(result);
    return result;
  }
  private void updateMetrics(Call result) {
    if (result == null) {
      return;
    }
    metrics.incTimeInQueue(result.timeInQueue());
    metrics.setCallQueueLen(this.size());
  }
//在队列中获取Runnable
  @Override
  public Runnable poll(long timeout, TimeUnit unit) throws InterruptedException {
    Call result = underlyingQueue.poll(timeout, unit);
    updateMetrics(result);
    return result;
  }
 //队列中删除runnable
  @Override
  public Runnable remove() {
    Call result = underlyingQueue.remove();
    updateMetrics(result);
    return result;
  }
  @Override
  public Runnable take() throws InterruptedException {
    Call result = underlyingQueue.take();
    updateMetrics(result);
    return result;
  }
//添加到队列中
@Override
  public int drainTo(Collection<? super Runnable> destination) {
    return drainTo(destination, Integer.MAX_VALUE);
  }
//添加到队列中
@Override
  public int drainTo(Collection<? super Runnable> destination,
                     int maxElements) {
    if (destination == this) {
      throw new IllegalArgumentException(
          "A BlockingQueue cannot drain to itself.");
    }
    List<Call> drained = new ArrayList<Call>();
    underlyingQueue.drainTo(drained, maxElements);
    for (Call r : drained) {
      updateMetrics(r);
    }
    destination.addAll(drained);
    int sz = drained.size();
    LOG.info("Elements drained: " + sz);
    return sz;
  }
//队列中是否能提供call
@Override
  public boolean offer(Runnable element) {
    return underlyingQueue.offer(new Call(element));
  }
  @Override
  public boolean offer(Runnable element, long timeout, TimeUnit unit)
      throws InterruptedException {
    return underlyingQueue.offer(new Call(element), timeout, unit);
  }
@Override
public void put(Runnable element) throws InterruptedException {
    underlyingQueue.put(new Call(element));
  }
  @Override
  public boolean add(Runnable element) {
    return underlyingQueue.add(new Call(element));
  }
  @Override
  public boolean addAll(Collection<? extends Runnable> elements) {
    int added = 0;
    for (Runnable r : elements) {
      added += underlyingQueue.add(new Call(r)) ? 1 : 0;
    }
    return added != 0;
  }
  @Override
  public Runnable element() {
    return underlyingQueue.element();
  }
  @Override
  public Runnable peek() {
    return underlyingQueue.peek();
  }
//清空队列
  @Override
  public void clear() {
    underlyingQueue.clear();
  }
  @Override
  public boolean containsAll(Collection<?> elements) {
    return underlyingQueue.containsAll(elements);
  }
  @Override
  public boolean isEmpty() {
    return underlyingQueue.isEmpty();
  }
  @Override
  public Iterator<Runnable> iterator() {
    return new Iterator<Runnable>() {
      final Iterator<Call> underlyingIterator = underlyingQueue.iterator();
      @Override
      public Runnable next() {
        return underlyingIterator.next();
      }
      @Override
      public boolean hasNext() {
        return underlyingIterator.hasNext();
      }
      @Override
      public void remove() {
        underlyingIterator.remove();
      }
    };
  }
  @Override
  public boolean removeAll(Collection<?> elements) {
    return underlyingQueue.removeAll(elements);
  }
  @Override
  public boolean retainAll(Collection<?> elements) {
    return underlyingQueue.retainAll(elements);
  }
  @Override
  public int size() {
    return underlyingQueue.size();
  }
  @Override
  public Object[] toArray() {
    return underlyingQueue.toArray();
  }
  @Override
  public <T> T[] toArray(T[] array) {
    return underlyingQueue.toArray(array);
  }
  @Override
  public boolean contains(Object element) {
    return underlyingQueue.contains(element);
  }
  @Override
  public int remainingCapacity() {
    return underlyingQueue.remainingCapacity();
  }
  @Override
  public boolean remove(Object element) {
    return underlyingQueue.remove(element);
  }
}
hbase thrift 访问队列的更多相关文章
- 使用C#通过Thrift访问HBase
		前言 因为项目需要要为客户程序提供C#.Net的HBase访问接口,而HBase并没有提供原生的.Net客户端接口,可以通过启动HBase的Thrift服务来提供多语言支持. Thrift介绍 环境 ... 
- HQueue:基于HBase的消息队列
		HQueue:基于HBase的消息队列 凌柏 1. HQueue简介 HQueue是一淘搜索网页抓取离线系统团队基于HBase开发的一套分布式.持久化消息队列.它利用HTable存储消息数据 ... 
- 通过Thrift访问HDFS分布式文件系统的性能瓶颈分析
		通过Thrift访问HDFS分布式文件系统的性能瓶颈分析 引言 Hadoop提供的HDFS布式文件存储系统,提供了基于thrift的客户端访问支持,但是因为Thrift自身的访问特点,在高并发的访问情 ... 
- MinerQueue.java 访问队列
		MinerQueue.java 访问队列 package com.iteye.injavawetrust.miner; import java.util.HashSet; import java.ut ... 
- hbase thrift 定义
		/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agre ... 
- HBase & thrift & C++编程
		目录 目录 1 1. 前言 1 2. 启动和停止thrift2 1 2.1. 启动thrift2 1 2.2. 停止thrift2 1 2.3. 启动参数 2 3. hbase.thrift 2 3. ... 
- HBase数据访问的一些常用方式
		类型 特点 场合 优缺点分析 Native Java API 最常规和高效的访问方式 适合MapReduce作业并行批处理HBase表数据 Hbase Shell HBase的命令行工具,最简单的访问 ... 
- windows通过thrift访问hdfs
		thirift是一个支持跨种语言的远程调用框架,通过thrift远程调用框架,结合hadoop1.x中的thriftfs,编写了一个针对hadoop2.x的thriftfs,供外部程序调用. 1.准备 ... 
- python Hbase Thrift pycharm   及引入包
		cp -r hbase/ /usr/lib/python2.7/site-packages/ 官方示例子http://code.google.com/p/hbase-thrift/source/bro ... 
随机推荐
- Linux日志管理高级进阶:实例详解syslog
			syslog已被许多日志函数采纳,它用在许多保护措施中,任何程序都可以通过syslog记录事件.syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息.它能记录本地事件或通过网络 ... 
- iOS7编程Cookbook中例15.8中一个小问题
			大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 该书的15.8例子标题为Editing Videos on a ... 
- 【并发编程】Binder运行机制的流程图
			Binder工作在Linux层面,属于一个驱动,只是这个驱动不需要硬件,或者说其操作的硬件是基于一小段内存.从线程的角度来讲,Binder驱动代码运行在内核态,客户端程序调用Binder是通过系统调用 ... 
- 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别
			http://www.cnblogs.com/AngelLee2009/p/3540527.html 
- JS 遍历对象 jQuery遍历对象
			jquery for 循环遍历对象的属性: //对象的定义如下: var person={id:"1",name:"springok",age:25}; for ... 
- 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s
			 1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2 spring-mv ... 
- Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader
			字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream Buffe ... 
- ROS_Kinetic_23 ROS流行版本和相关书籍汇总
			目前,ROS使用的主流版本主要是下面四种:Hydro,Indigo,Jade,Kinetic. Distro Release date Poster Tuturtle, turtle in tutor ... 
- 2、Android构建本地单元测试
			如果你的单元测试在Android中没有依赖或者只有简单的以来,你可以在你的本地开发环境中运行你的测试.这种测试比较高效因为它能让你避免将整个app安装到物理设备或虚拟机中执行单元测试.最后,执行单元测 ... 
- SSH深度历险(四)    Maven初步学习
			这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理 ... 
