/**
* Project: dataserver.tools-0.1.0-SNAPSHOT
*
* File Created at 2011-8-4
* $Id$
*
* Copyright 1999-2100 Alibaba.com Corporation Limited.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Alibaba Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Alibaba.com.
*/
package com.alibaba.doris.client.tools.importdata;
import java.util.Queue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
import com.alibaba.doris.client.net.Connection;
import com.alibaba.doris.client.tools.concurrent.ParralelTaskImpl;
import com.alibaba.doris.common.data.Key;
import com.alibaba.doris.common.data.Value;
import com.alibaba.doris.common.data.impl.KeyImpl;
import com.alibaba.doris.common.data.impl.ValueImpl;
import com.alibaba.doris.common.route.VirtualRouter;
/**
* TODO Comment of QueuePutTask
*
* @author luyi.huangly
*/
public class QueuePutTask extends ParralelTaskImpl {
private Queue<KeyPair> keyQueue;
private Connection connection;
private VirtualRouter virtualRouter;
ReentrantLock lock = new ReentrantLock(); //锁
//根据锁产生Condition对象
Condition produced = lock.newCondition();
private AtomicBoolean finish;
public AtomicBoolean getFinish() {
return finish;
}
public void setFinish(AtomicBoolean finish) {
this.finish = finish;
}
public Queue<KeyPair> getKeyQueue() {
return keyQueue;
}
public void setKeyQueue(Queue<KeyPair> keyQueue) {
this.keyQueue = keyQueue;
}
public Connection getConnection() {
return connection;
}
public void setConnection(Connection connection) {
this.connection = connection;
}
public VirtualRouter getVirtualRouter() {
return virtualRouter;
}
public void setVirtualRouter(VirtualRouter virtualRouter) {
this.virtualRouter = virtualRouter;
}
public ReentrantLock getLock() {
return lock;
}
public void setLock(ReentrantLock lock) {
this.lock = lock;
}
public Condition getProduced() {
return produced;
}
public void setProduced(Condition produced) {
this.produced = produced;
}
public void run() {
startCountDownLatch.countDown();
while (true) {
long startTime = System.currentTimeMillis();
if (needPofiling) {
permMeter.startRecord();
}
lock.lock();
KeyPair keyPair = null;
try {
if (keyQueue.isEmpty()) {
if (finish.get() == Boolean.TRUE) {//当队列中没有
resultCountDownLatch.countDown();
produced.signalAll();
return;
} else {
try {
produced.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
if (keyQueue.isEmpty()) {
continue;
}
keyPair = keyQueue.poll();
} finally {
lock.unlock();
}
doRun(keyPair);
if (needPofiling) {
permMeter.endRecord();
long endTime = System.currentTimeMillis();
long ellapseTime = endTime - startTime;
permMeter.addItem(ellapseTime);
// permMeter.printReport();
}
}
}
public void doRun(KeyPair keyPair) {
String key = keyPair.getKey();
int vnode = virtualRouter.findVirtualNode(key);
int commaIndex = key.indexOf(":");
if (commaIndex == -1) {
throw new IllegalArgumentException("Invalid kp parameter: " + key + ", Format 101:abc");
}
String ns = key.substring(0, commaIndex);
String logicKey = key.substring(commaIndex + 1);
int namespaceId = Integer.valueOf(ns);
Key key1 = new KeyImpl(namespaceId, logicKey, vnode);
String value = keyPair.getValue();
Value value1 = new ValueImpl(value.getBytes(), System.currentTimeMillis());
try {
connection.put(key1, value1).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}