In the development of message-oriented middleware, it is often necessary to generate a unique message identifier. You can add a corresponding prefix to the server deployed in the project, and then the timestamp is too long based on the system timestamp, it can be converted into a 36-digit string to form the unique identifier of the message:
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 dayCalendar 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);}}
Generation of unique message IDs in JMS