jms中唯一的消息id的生成

在做消息中间件的开发中常常要生成唯一的消息的标识,可以根据项目部署的服务器加上相应的前缀,然后根据系统的 时间戳,时间戳太长了,可以转成36进制的字符串,便形成了消息的唯一标识:

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

public class MsgIDUtil {
	private static final int BASE_YEAR = 2013;
	private static final long MILLISECOND_PER_DAY = 86400000L;
	private static long lastTicketTime = 0l;	

	public static synchronized String generateTicketNumber(String prefix) {
		if (prefix != null && prefix.trim().length() > 0) {
			return prefix + generateTicketNumber();
		}
		return generateTicketNumber();
	}

	public static synchronized String generateTicketNumber() {
		long givenTime = System.currentTimeMillis();
		if (givenTime <= lastTicketTime) {
			givenTime = lastTicketTime + 1;
		}
		String result = generateTicketNumber(givenTime);
		lastTicketTime = givenTime;
		return result;
	}

	protected static synchronized String generateTicketNumber(long givenTime) {

		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(givenTime);

		int year = cal.get(Calendar.YEAR);
		int yearIndex = year - BASE_YEAR;
		if (yearIndex < 0 || yearIndex > 36) {
			throw new IllegalArgumentException("Input Time is earlier then "
		          + BASE_YEAR + " or greater than " + BASE_YEAR + 36);
		}
		int dayOfYear = cal.get(Calendar.DAY_OF_YEAR);
		// get base line of the time of the day
		Calendar cal2 = Calendar.getInstance();
		cal2.clear();
		cal2.set(Calendar.YEAR, year);
		cal2.set(Calendar.DAY_OF_YEAR, dayOfYear);
		long baselineTime = cal2.getTimeInMillis();
		StringBuilder sb = new StringBuilder();
		sb.append(Integer.toString(yearIndex, 36));
		String dayOfYearStr = Integer.toString(dayOfYear, 36);
		for (int i = 0; i < (2 - dayOfYearStr.length()); i++) {
			sb.append(0);
		}
		sb.append(dayOfYearStr);
		String timeOfDayStr = Long.toString(givenTime - baselineTime, 36);
		for (int i = 0; i < (6 - timeOfDayStr.length()); i++) {
			sb.append(0);
		}
		sb.append(timeOfDayStr);
		return sb.toString().toUpperCase();
	}

	public static long getTicketTime(String ticketNumber) {
		if (ticketNumber == null || ticketNumber.trim().length() < 9 || ticketNumber.trim().length() > 10) {
			throw new IllegalArgumentException("Input ID is not valid -->" + ticketNumber);
		}

		if (ticketNumber.trim().length() == 10) {
			ticketNumber = ticketNumber.trim().substring(1);

		}

		int yearIndex = Integer.parseInt(ticketNumber.substring(0, 1), 36);
		int dayIndex = Integer.parseInt(ticketNumber.substring(1, 3), 36);
		long millIndex = Long.parseLong(ticketNumber.substring(3), 36);
		if (dayIndex > 365 || millIndex > MILLISECOND_PER_DAY) {
			throw new IllegalArgumentException("Can't parse the input Ticket number " + ticketNumber);
		}

		Calendar result = Calendar.getInstance();

		result.clear();

		result.set(Calendar.YEAR, BASE_YEAR + yearIndex);
		result.set(Calendar.DAY_OF_YEAR, dayIndex);
		return result.getTimeInMillis() + millIndex;
	}

	private static long getTimeFromStr(String dateValue, String dateFormat) throws ParseException {
		SimpleDateFormat sdFormat = new SimpleDateFormat(dateFormat);
		Date output = sdFormat.parse(dateValue);

		return output.getTime();
	}

	protected static synchronized String generateTicketNumber(String dateValue, String dateFormat) throws ParseException {
		long givenTime = getTimeFromStr(dateValue, dateFormat);
		return generateTicketNumber(givenTime);
	}

	public static void main(String[] args) {
		String newTicketNumber = generateTicketNumber("A");
		System.out.println(newTicketNumber);
	}

}
时间: 2025-01-10 23:54:43

jms中唯一的消息id的生成的相关文章

sqlSever excel数据导入表中,表的ID格式化生成。

1.查询 itemList表. SELECT * FROM dbo.itemList 如图: <图一> itemList 共有 28条数据 现在我要实现,从excel数据导入itemList这个表,要求 itemId 里面的值 符合P*********格式,并且是接着递增,如在新增应为P000000029, 但是这个itemId是程序生成的,如何在插入时候自动生成,P000000030,P000000031...格式呢. 1.将excel数据格式导入数据库,这时候生成表 temp. 2.查询t

融云技术分享:解密融云IM产品的聊天消息ID生成策略

本文来自融云技术团队原创分享,原文发布于“融云全球互联网通信云”公众号,原题<如何实现分布式场景下唯一 ID 生成?>,即时通讯网收录时有部分改动. 1.引言 对于IM应用来说,消息ID(或称序列号)是个看似不起眼,但非常重要的东西之一. 消息ID的使用贯穿了IM技术逻辑的方方面面,比如: 1)聊天消息的顺序保证: 2)聊天消息QoS送达保证机制时的去重: 3)特定聊天消息的精确查找和匹配: 4)聊天消息的已读未读处理: 5)聊天消息的送达回执: 6)群聊消息的扩散读拉取标记: 7)... .

分布式系统唯一ID的生成方案讨论

在分布式系统下唯一id问题,就是id咋生成?比如分表分库,因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那是不对的.举个例子,一个表拆分为了2张表,每个表的id都从1开始累加,这个肯定有问题了!你的系统就没办法根据表主键来查询了,比如id = 10这个记录,在两个表里都有!所以此时就需要分布式架构下的全局唯一id生成的方案了,保证每个表内的某个id,全局唯一.全局唯一id主要有以下几种方案. 分布式ID的生成方案 1. UUID 算法的核心思想是结合机器的网卡.当地时间.一个

php学习之道:php中soap的使用实例以及生成WSDL文件,提供自动生成WSDL文件的类库——SoapDiscovery.class.php类

1. web service普及: Webservice soap wsdl区别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供一种办事接口的统称. WSDL提供"能办的事的文档说明":  对要提供的服务的一种描述格式.我想帮你的忙,但是我要告诉你我都能干什么,以及干这些事情需要的参数类型. SOAP提供"请求"的规范:  向服务接口传递请求的格式,包括方法和参数等.你想让人家办事,总得告诉人家

Spring整合JMS(二)——三种消息监听器

一.消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.SessionAwareMessageListener和MessageListenerAdapter.下面就分别来介绍一下这几种类型的区别. 1).MessageListener MessageListener是最原始的消息监听器,它是JMS规范中定义的一个接口.其中定义了一个用于处理接收到的消息的onMessage方法,

使用locust对设备ID的生成逻辑的并发测试初步实践

项目背景:现阶段我们项目主要有两大场景,一是交易风控,二是账户风控,两大的场景的很多规则都和设备ID有关,比如设备黑名单,设备A在黑名单库并且相关规则开启,设备A请求交易时就会有预警事件发生,所以设备ID的生成逻辑至关重要,主要和A.B.C 三大因素有关,大概如下: 1.同A,不管后面的B,C是否不一致首先根据传入消息的A ,到ES中查询 如果存在相同的则用原A的设备ID(DeviceID)2.不同A1)B一样,C不一样,则用原B的设备ID(DeviceID)2)C一样,B不一样,则用原C的设备

Modbus库开发笔记之二:Modbus消息帧的生成

前面我们已经对Modbus的基本事务作了说明,也据此设计了我们将要实现的主从站的操作流程.这其中与Modbus直接相关的就是Modbus消息帧的生成.Modbus消息帧也是实现Modbus通讯协议的根本. 1.Modbus消息帧分析 MODBUS协议在不同的物理链路上的消息帧有一些差异,但我们分析一下就会发现,在这些不同的消息帧中具有一下相同的部分,这对我们实现统一的数据操作非常重要,具体描述如下: (1).简单协议数据单元 MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)

protobuf 中的嵌套消息的使用

protobuf的简单的使用,不过还留下了一个问题,那就是之前主要介绍的都是对简单数据的赋值,简单数据直接采用set_xx()即可,但是如果不是简单变量而是自定义的复合类型变量,就没有简单的set函数调用了,下面看一个简单的例子. 在网络游戏中,游戏玩家之间的同步是一个最基本的功能,而同步是通过对坐标的广播进行的,因此我们假设一个简单的模型,当一个玩家的位置发生变化时,将玩家的新位置发给地图内所有玩家,根据这个情况写出以下proto文件.   message PlayerPos{ require

母版页中对控件ID的处理

注:此系列记录在我实际开发中遇到的问题和收藏一些技巧文章. 本篇技巧和诀窍记录的是:母版页中对控件ID的处理. 一.问题提出 由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的页面全部套用了母版页.但是出现了一个错误--在我的Blog中记录一下,方便大家参考. 二. 抽象模型 由于整个页面内容过多,所以我把这个页面中最为本质的问题抽象出来.原来单一页面,就是利用按钮触发JS事件,在文本域中插入"(_)"功能,其实现代码如下: