java生成申请单序列号的实现方法

 更新时间:2014年01月03日 15:17:22   作者:  
申请单序列号一般要求根据一定的规则生成后几位连续的字符串,下面是我项目中使用的生成序列号的代码,其中用到了锁机制,有需要的朋友可以参考一下

复制代码 代码如下:

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

/**
 * 产生流水号工具类
 * @version V1.0
 * @date: 2013-11-16 下午5:21:37
 */

public class SerialNum {

 private static String count = "000";
 private static String dateValue = "20131115";

 /**
  * 产生流水号
  */
 public synchronized static String getMoveOrderNo() {
  long No = 0;
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  String nowdate = sdf.format(new Date());
  No = Long.parseLong(nowdate);
  if (!(String.valueOf(No)).equals(dateValue)) {
   count = "000";
   dateValue = String.valueOf(No);
  }
  String num = String.valueOf(No);
  num += getNo(count);
  num = "CB" + num;
  return num;
 }

 /**
  * 获取撤展单序列号
  */
 public synchronized static String getMoveOrderNo(String serialNum) {
  String nyr = StringUtils.substring(serialNum, 2, 10); // 获取年月日字符串
  String countV = StringUtils.substring(serialNum, 10); // 获取流水号
  if (Integer.valueOf(countV) > Integer.valueOf(count)) {
   dateValue = nyr;
   count = String.valueOf(countV);
  }
  return getMoveOrderNo();
 }

 /**
  * 返回当天的订单数+1
  */
 public static String getNo(String s) {
  String rs = s;
  int i = Integer.parseInt(rs);
  i += 1;
  rs = "" + i;
  for (int j = rs.length(); j < 3; j++) {
   rs = "0" + rs;
  }
  count = rs;
  return rs;
 }

 public static void main(String[] args) {
  for (int i = 0; i < 10; i++) {
   System.out.println(getMoveOrderNo());
  }
 }

}

注意:上面的程序如果服务器一直能够正常运行就不会出什么问题,要是重启服务器或者中间出现什么故障需要重启服务都可能造成重复序列号的产生,为了能够保证唯一,我们需要配合上数据库的查询,查询最后一条记录,然后拿出序列号在调用getMoveOrderNo(String serialNum)这个方法,就能够保证什么情况下生成的序列号都是正确唯一的。

相关文章

  • Spring Boot MQTT Too many publishes in progress错误的解决方案

    Spring Boot MQTT Too many publishes in progress错误的解决方

    本文介绍Spring Boot MQTT Too many publishes in progress错误的解决方案,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-07-07
  • Java8实现优雅的获取重复字符与次数

    Java8实现优雅的获取重复字符与次数

    这篇文章主要为大家详细介绍了在Java8中,我们应该如何进行字符及字符串的去重,以及计算去重次数,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2023-12-12
  • springboot整合mybatis的超详细过程(配置模式+注解模式)

    springboot整合mybatis的超详细过程(配置模式+注解模式)

    这篇文章主要介绍了springboot整合mybatis的详细过程(配置模式+注解模式),这里我使用的是配置模式+注解模式所以需要配置全局文件,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 浅谈springboot一个service内组件的加载顺序

    浅谈springboot一个service内组件的加载顺序

    这篇文章主要介绍了springboot一个service内组件的加载顺序,具有很好的参考价值,希望对大家有所帮助。以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家
    2021-08-08
  • springboot项目不输出nohup.out日志的解决

    springboot项目不输出nohup.out日志的解决

    这篇文章主要介绍了springboot项目不输出nohup.out日志的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java使用randomaccessfile在文件任意位置写入数据

    java使用randomaccessfile在文件任意位置写入数据

    Java在文件任意位置写入数据可以使用RandomAccessFile方法来完成,下面看一个简单的示例就明白了
    2014-01-01
  • Java 多线程并发ReentrantLock

    Java 多线程并发ReentrantLock

    这篇文章主要介绍了Java 多线程并发ReentrantLock,Java 提供了 ReentrantLock 可重入锁来提供更丰富的能力和灵活性,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java模拟QQ实现聊天互动程序

    Java模拟QQ实现聊天互动程序

    这篇文章主要介绍了如何利用Java语言模拟QQ实现一个简易的聊天互动程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • Spring如何消除代码中的if-else/switch-case

    Spring如何消除代码中的if-else/switch-case

    这篇文章主要给大家介绍了关于Spring如何消除代码中if-else/switch-case的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Java实现文件批量重命名具体实例

    Java实现文件批量重命名具体实例

    这篇文章主要介绍了Java实现文件批量重命名具体实例,需要的朋友可以参考下
    2014-02-02

最新评论