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 ...
随机推荐
- RxJava(三) flatMap操作符用法详解
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51532776 本文出自:[余志强的博客] flatMap操作符的作用 ...
- Android Multimedia框架总结(十一)CodeC部分之AwesomePlayer到OMX服务
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52623882 前言:上篇文< ...
- FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-PU
===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...
- 【Netty源码解析】NioEventLoop
上一篇博客[Netty源码学习]EventLoopGroup中我们介绍了EventLoopGroup,实际说来EventLoopGroup是EventLoop的一个集合,EventLoop是一个单线程 ...
- 3.0、Android Studio构建和运行应用
默认情况下,Android Studio可以通过简单的点击就会将新的项目部署到虚拟机或者物理设备中.在Instant Run的帮助下,你可以将更改的方法或资源文件直接推送到一个运行的app而无需构建一 ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- Centos7安装RocketMQ及配置测试
环境 Centos7 RocketMQ 3.2.6 安装位置 /usr/local/alibaba-rockermq 外网ip 182.254.145.66 内网ip 10.105.23.114 安装 ...
- Android传感器概述-android学习之旅(七)
传感器概述 传感器是第二代智能手机的重要标志之一.现在许多的手机和平板都内置了传感器(tv除外).android的SDK支持许多的传感器有十几种,但是手机只是支持一部分.例如方向传感器(电子罗盘)和重 ...
- 关于tomcat中Servlet对象池
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...
- pyinstaller使用-python项目转换成exe可执行文件
http://blog.csdn.net/pipisorry/article/details/50620122 Python不是每个人的计算机里面都有安装,当您写了一个好用的工具,需要一个standa ...