12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package com.diagbot.idc;
- import com.diagbot.enums.VisibleIdTypeEnum;
- import com.diagbot.util.DateUtil;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.lang3.RandomUtils;
- import org.apache.commons.lang3.time.DateUtils;
- import java.util.Calendar;
- /**
- * @Description: 可见id每秒递增
- * @author: gaodm
- * @time: 2018/9/5 10:45
- */
- @Slf4j
- public class VisibleIdCreater extends AbstractIdCreater<Integer> {
- private long lastTimestamp = -1L;
- private long sequence = 0L;
- private long sequenceMask = 9999;
- public VisibleIdCreater(int machineId, int dataCenterId) {
- super(machineId, dataCenterId);
- }
- /**
- * 对外id生成规则
- * 1809051234550001
- * 180905 - 12345 - 1 - 0001
- * 日期 - 秒数 - 业务 - 秒内自增
- *
- * @param type 业务id 1.订单 2.交易 3.退款
- * @return 生成的id
- */
- @Override
- public synchronized Long getNextId(Integer type) {
- Calendar calendar = Calendar.getInstance();
- long timestamp = timeGen() / 1000;
- if (timestamp < lastTimestamp) {
- log.error(String.format("clock is moving backwards. Rejecting requests until %d.", lastTimestamp));
- throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
- }
- if (lastTimestamp == timestamp) {
- sequence = (sequence + 1);
- if (sequence > sequenceMask) {
- //timestamp = tilNextMillis(lastTimestamp);
- log.error(String.format("id creater sequence is full. wait to next time"));
- return null;
- }
- } else {
- sequence = getNewSequence();
- }
- lastTimestamp = timestamp;
- String date = DateUtil.format(calendar.getTime(), "yyMMdd");
- long seconds = DateUtils.getFragmentInSeconds(calendar, Calendar.DAY_OF_YEAR);
- return Long.valueOf(date + String.format("%05d", seconds) + String.valueOf(type) + sequence);
- }
- private long getNewSequence() {
- return RandomUtils.nextInt(1000, 2000);
- }
- public static void main(String[] args) {
- VisibleIdCreater visibleIdCreater = new VisibleIdCreater(0, 0);
- System.out.println(visibleIdCreater.getNextId(VisibleIdTypeEnum.PATIENT_NO.getKey()));
- }
- }
|