All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.github.ltsopensource.queue.mongo.MongoExecutableJobQueue Maven / Gradle / Ivy
package com.github.ltsopensource.queue.mongo;
import com.github.ltsopensource.core.cluster.Config;
import com.github.ltsopensource.core.commons.concurrent.ConcurrentHashSet;
import com.github.ltsopensource.core.commons.utils.CollectionUtils;
import com.github.ltsopensource.core.commons.utils.StringUtils;
import com.github.ltsopensource.core.logger.Logger;
import com.github.ltsopensource.core.logger.LoggerFactory;
import com.github.ltsopensource.core.support.JobQueueUtils;
import com.github.ltsopensource.core.support.SystemClock;
import com.github.ltsopensource.queue.ExecutableJobQueue;
import com.github.ltsopensource.queue.domain.JobPo;
import com.github.ltsopensource.store.jdbc.exception.DupEntryException;
import com.github.ltsopensource.store.jdbc.exception.JdbcException;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.DuplicateKeyException;
import com.mongodb.WriteResult;
import org.mongodb.morphia.query.Query;
import org.mongodb.morphia.query.UpdateOperations;
import java.util.List;
/**
* @author Robert HG ([email protected] ) on 5/28/15.
*/
public class MongoExecutableJobQueue extends AbstractMongoJobQueue implements ExecutableJobQueue {
private static final Logger LOGGER = LoggerFactory.getLogger(MongoExecutableJobQueue.class);
public MongoExecutableJobQueue(Config config) {
super(config);
}
@Override
protected String getTargetTable(String taskTrackerNodeGroup) {
if (StringUtils.isEmpty(taskTrackerNodeGroup)) {
throw new JdbcException("taskTrackerNodeGroup can not be null");
}
return JobQueueUtils.getExecutableQueueName(taskTrackerNodeGroup);
}
private ConcurrentHashSet EXIST_TABLE = new ConcurrentHashSet();
@Override
public boolean createQueue(String taskTrackerNodeGroup) {
String tableName = JobQueueUtils.getExecutableQueueName(taskTrackerNodeGroup);
DBCollection dbCollection = template.getCollection(tableName);
List indexInfo = dbCollection.getIndexInfo();
// create index if not exist
if (CollectionUtils.sizeOf(indexInfo) <= 1) {
template.ensureIndex(tableName, "idx_jobId", "jobId", true, true);
template.ensureIndex(tableName, "idx_taskId_taskTrackerNodeGroup", "taskId, taskTrackerNodeGroup", true, true);
template.ensureIndex(tableName, "idx_taskTrackerIdentity", "taskTrackerIdentity");
template.ensureIndex(tableName, "idx_jobType", "jobType");
template.ensureIndex(tableName, "idx_realTaskId_taskTrackerNodeGroup", "realTaskId, taskTrackerNodeGroup");
template.ensureIndex(tableName, "idx_triggerTime_priority_gmtCreated", "triggerTime,priority,gmtCreated");
template.ensureIndex(tableName, "idx_isRunning", "isRunning");
LOGGER.info("create queue " + tableName);
}
EXIST_TABLE.add(tableName);
return true;
}
@Override
public boolean removeQueue(String taskTrackerNodeGroup) {
String tableName = JobQueueUtils.getExecutableQueueName(taskTrackerNodeGroup);
DBCollection dbCollection = template.getCollection(tableName);
dbCollection.drop();
LOGGER.info("drop queue " + tableName);
return true;
}
@Override
public boolean add(JobPo jobPo) {
try {
String tableName = JobQueueUtils.getExecutableQueueName(jobPo.getTaskTrackerNodeGroup());
if (!EXIST_TABLE.contains(tableName)) {
createQueue(jobPo.getTaskTrackerNodeGroup());
}
jobPo.setGmtCreated(SystemClock.now());
jobPo.setGmtModified(jobPo.getGmtCreated());
template.save(tableName, jobPo);
} catch (DuplicateKeyException e) {
// 已经存在
throw new DupEntryException(e);
}
return true;
}
@Override
public boolean remove(String taskTrackerNodeGroup, String jobId) {
String tableName = JobQueueUtils.getExecutableQueueName(taskTrackerNodeGroup);
Query query = template.createQuery(tableName, JobPo.class);
query.field("jobId").equal(jobId);
WriteResult wr = template.delete(query);
return wr.getN() == 1;
}
@Override
public boolean removeBatch(String realTaskId, String taskTrackerNodeGroup) {
String tableName = JobQueueUtils.getExecutableQueueName(taskTrackerNodeGroup);
Query query = template.createQuery(tableName, JobPo.class);
query.field("realTaskId").equal(realTaskId);
query.field("taskTrackerNodeGroup").equal(taskTrackerNodeGroup);
template.delete(query);
return true;
}
public void resume(JobPo jobPo) {
String tableName = JobQueueUtils.getExecutableQueueName(jobPo.getTaskTrackerNodeGroup());
Query query = template.createQuery(tableName, JobPo.class);
query.field("jobId").equal(jobPo.getJobId());
UpdateOperations operations =
template.createUpdateOperations(JobPo.class)
.set("isRunning", false)
.set("taskTrackerIdentity", "")
.set("gmtModified", SystemClock.now());
template.update(query, operations);
}
@Override
public List getDeadJob(String taskTrackerNodeGroup, long deadline) {
String tableName = JobQueueUtils.getExecutableQueueName(taskTrackerNodeGroup);
Query query = template.createQuery(tableName, JobPo.class);
query.field("isRunning").equal(true).
filter("gmtCreated < ", deadline);
return query.asList();
}
@Override
public JobPo getJob(String taskTrackerNodeGroup, String taskId) {
String tableName = JobQueueUtils.getExecutableQueueName(taskTrackerNodeGroup);
Query query = template.createQuery(tableName, JobPo.class);
query.field("taskId").equal(taskId).
field("taskTrackerNodeGroup").equal(taskTrackerNodeGroup);
return query.get();
}
}