All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yuweix.kuafu.sequence.base.AbstractSequence Maven / Gradle / Ivy

There is a newer version: 2.0.0
Show newest version
package com.yuweix.kuafu.sequence.base;


import com.yuweix.kuafu.sequence.bean.SequenceHolder;
import com.yuweix.kuafu.sequence.dao.SequenceDao;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/**
 * @author yuwei
 */
public abstract class AbstractSequence implements Sequence {
	protected final Lock lock = new ReentrantLock();
	protected volatile SequenceHolder sequenceHolder;

	@SeqField(isDao = true)
	protected SequenceDao sequenceDao;
	@SeqField(isName = true)
	protected String name;
	@SeqField(isMinValue = true)
	protected long minValue;


	public AbstractSequence() {

	}

	@PostConstruct
	public void init() {
		synchronized(this) {
			sequenceDao.ensure(name, minValue);
		}
	}

	@PreDestroy
	public void destroy() {

	}

	@Override
	public long next() {
		ensureSequenceHolder();
		return nextVal();
	}

	protected abstract long nextVal();

	private void ensureSequenceHolder() {
		if (sequenceHolder != null) {
			return;
		}
		lock.lock();
		try {
			if (sequenceHolder == null) {
				sequenceHolder = sequenceDao.nextRange(name);
			}
		} finally {
			lock.unlock();
		}
	}

	public void setSequenceDao(SequenceDao sequenceDao) {
		this.sequenceDao = sequenceDao;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setMinValue(long minValue) {
		this.minValue = minValue;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy