GUID为什么会重复了,是代码有问题吗?

根据我在网上查到资料,表示GUID重复几率很小,但是我这边项目最近一启动,没过多长时间就会有重复的GUID生成,是我代码上面写的有问题吗?

具体代码如下:

public class AccountTaskExecutorTask extends TimerTask {
    private static final Logger logger = Logger.getLogger(AccountTaskExecutorTask.class);
    private TellerDbCore.AccountTask.Builder aTask = null;

    public AccountTaskExecutorTask(TellerDbCore.AccountTask.Builder aTask) {
        this.aTask = aTask;
    }

    public static void schedule(TellerDbCore.AccountTask.Builder aTask) {
        Timer timer = new Timer();
        timer.schedule(new AccountTaskExecutorTask(aTask), 100L);
    }

    @Override
    public void run() {
        try {
            process(aTask);
        } catch (Exception e) {
            logger.error("", e);
        }
    }

    public static void process(TellerDbCore.AccountTask.Builder aTask) {
        DataBaseStore dataBaseStore = null;
        try {
                dataBaseStore = DbHelper.getTransactableDbStore();
                invest(aTask, dataBaseStore);
                dataBaseStore.commitAndClose();
                dataBaseStore = null;
            } catch (Exception e) {
                logger.error("", e);
                if (dataBaseStore != null) {
                    dataBaseStore.rollbackAndClose();
                    dataBaseStore = null;
                }
            }
    }


    private static void invest(TellerDbCore.AccountTask.Builder theTask, DataBaseStore dataBaseStore) throws Exception {
        if (theTask.getProductType() == BtsDbBase.ProductType.PT_NONE_LOCK
                || theTask.getProductType() == BtsDbBase.ProductType.PT_LOCK_3
                || theTask.getProductType() == BtsDbBase.ProductType.PT_LOCK_7) {
            switch (theTask.getTaskStatus()) {
                case TS_READY:
                    List<TellerDbCore.AccountSubTask.Builder> subList = AccountTaskHelper.querySubAtByMtId(theTask.getTaskId(), dataBaseStore);
                    if (subList.size() == 0) {
                        NewMethods.newAccountSubTask(theTask.getTaskId(), GUID.generateGUID().toLowerCase(),
                                theTask.getAccountId(), theTask.getProductType(), theTask.getTaskType(), theTask.getAmount(), dataBaseStore);
                    }
                    UpdateMethods.updateAccountTask(theTask.getTaskId(), null, BtsDbBase.TaskStatus.TS_PROCESSING, dataBaseStore);
                    break;
                case TS_PROCESSING:
                    List<TellerDbCore.AccountSubTask.Builder> subTaskList = AccountTaskHelper.querySubAtByMtId(theTask.getTaskId(), dataBaseStore);
                    if (subTaskList.size() == 1) {
                        TellerDbCore.AccountSubTask.Builder aSubTask = subTaskList.get(0);
                        VirtualDbBase.TaskStatus vTs = VirtualConnector.queryTaskStatus(aSubTask.getVrNo(), null);
                        if (vTs == null) {
                            VirtualConnector.submitTask(theTask.getAccountId(), BizConstant.VIRTUAL_SYS_INTERMEDIARY,
                                    aSubTask.getAmount() / 100, aSubTask.getVrNo(), VirtualDbBase.TransferType.TT_INVEST,
                                    theTask.getRequestNo());
                        } 
                    } else {
                        throw new RuntimeException(ErrCode.SYSTEM_ERROR);
                    }
                    break;
                case TS_SUCCESSED:
                case TS_FAILED:
                    break;
                default:
                    logger.info( theTask.getTaskStatus());
                    break;
            }
        }
    }
}

这段代码里面是通过GUID.generateGUID().toLowerCase()来生成GUID,它是oscore-2.2.4.jar包下的类方法。

阅读 3.8k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题