精华内容
下载资源
问答
  • uuid:(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码...

    uuid:(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得)

    select LOWER(rawtohex(sys_guid())) from dual;
    
    展开全文
  • * * @return 此 {@code UUID} 的时钟序列 * * @throws UnsupportedOperationException 如果此 UUID 的 version 为 1*/ public intclockSequence() throws UnsupportedOperationException { checkTimeBase();...

    import java.security.MessageDigest;

    import java.security.NoSuchAlgorithmException;

    import java.security.SecureRandom;

    import java.util.Random;

    import java.util.concurrent.ThreadLocalRandom;/**

    * 提供通用唯一识别码(universally unique identifier)(UUID)实现

    **/

    public final class UUID implements java.io.Serializable, Comparable{private static final long serialVersionUID = -1185015143654744140L;/**

    * SecureRandom 的单例

    **/

    private static classHolder

    {static final SecureRandom numberGenerator =getSecureRandom();

    }/** 此UUID的最高64有效位*/

    private final longmostSigBits;/** 此UUID的最低64有效位*/

    private final longleastSigBits;/**

    * 私有构造

    *

    * @param data 数据*/

    private UUID(byte[] data)

    {long msb = 0;long lsb = 0;

    assert data.length== 16 : "data must be 16 bytes in length";for (int i = 0; i < 8; i++)

    {

    msb= (msb << 8) | (data[i] & 0xff);

    }for (int i = 8; i < 16; i++)

    {

    lsb= (lsb << 8) | (data[i] & 0xff);

    }this.mostSigBits =msb;this.leastSigBits =lsb;

    }/**

    * 使用指定的数据构造新的 UUID。

    *

    * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位

    * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位*/

    public UUID(long mostSigBits, longleastSigBits)

    {this.mostSigBits =mostSigBits;this.leastSigBits =leastSigBits;

    }/**

    * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。

    *

    * @return 随机生成的 {@code UUID}*/

    public staticUUID fastUUID()

    {return randomUUID(false);

    }/**

    * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。

    *

    * @return 随机生成的 {@code UUID}*/

    public staticUUID randomUUID()

    {return randomUUID(true);

    }/**

    * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。

    *

    * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能

    * @return 随机生成的 {@code UUID}*/

    public staticUUID randomUUID(boolean isSecure)

    {

    final Random ng= isSecure ?Holder.numberGenerator : getRandom();byte[] randomBytes = new byte[16];

    ng.nextBytes(randomBytes);

    randomBytes[6] &= 0x0f; /*clear version*/randomBytes[6] |= 0x40; /*set to version 4*/randomBytes[8] &= 0x3f; /*clear variant*/randomBytes[8] |= 0x80; /*set to IETF variant*/

    return newUUID(randomBytes);

    }/**

    * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。

    *

    * @param name 用于构造 UUID 的字节数组。

    *

    * @return 根据指定数组生成的 {@code UUID}*/

    public static UUID nameUUIDFromBytes(byte[] name)

    {

    MessageDigest md;try{

    md= MessageDigest.getInstance("MD5");

    }catch(NoSuchAlgorithmException nsae)

    {throw new InternalError("MD5 not supported");

    }byte[] md5Bytes =md.digest(name);

    md5Bytes[6] &= 0x0f; /*clear version*/md5Bytes[6] |= 0x30; /*set to version 3*/md5Bytes[8] &= 0x3f; /*clear variant*/md5Bytes[8] |= 0x80; /*set to IETF variant*/

    return newUUID(md5Bytes);

    }/**

    * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。

    *

    * @param name 指定 {@code UUID} 字符串

    * @return 具有指定值的 {@code UUID}

    * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常

    **/

    public staticUUID fromString(String name)

    {

    String[] components= name.split("-");if (components.length != 5)

    {throw new IllegalArgumentException("Invalid UUID string:" +name);

    }for (int i = 0; i < 5; i++)

    {

    components[i]= "0x" +components[i];

    }long mostSigBits = Long.decode(components[0]).longValue();

    mostSigBits<<= 16;

    mostSigBits|= Long.decode(components[1]).longValue();

    mostSigBits<<= 16;

    mostSigBits|= Long.decode(components[2]).longValue();long leastSigBits = Long.decode(components[3]).longValue();

    leastSigBits<<= 48;

    leastSigBits|= Long.decode(components[4]).longValue();return newUUID(mostSigBits, leastSigBits);

    }/**

    * 返回此 UUID 的 128 位值中的最低有效 64 位。

    *

    * @return 此 UUID 的 128 位值中的最低有效 64 位。*/

    public longgetLeastSignificantBits()

    {returnleastSigBits;

    }/**

    * 返回此 UUID 的 128 位值中的最高有效 64 位。

    *

    * @return 此 UUID 的 128 位值中最高有效 64 位。*/

    public longgetMostSignificantBits()

    {returnmostSigBits;

    }/**

    * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。

    *

    * 版本号具有以下含意:

    *

    *

    1 基于时间的 UUID

    *

    2 DCE 安全 UUID

    *

    3 基于名称的 UUID

    *

    4 随机生成的 UUID

    *

    *

    * @return 此 {@code UUID} 的版本号*/

    public intversion()

    {//Version is bits masked by 0x000000000000F000 in MS long

    return (int) ((mostSigBits >> 12) & 0x0f);

    }/**

    * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。

    *

    * 变体号具有以下含意:

    *

    *

    0 为 NCS 向后兼容保留

    *

    2 IETF RFC 4122(Leach-Salz'" DESIGNTIMESP=518>http://www.ietf.org/rfc/rfc4122.txt">IETF RFC 4122(Leach-Salz), 用于此类

    *

    6 保留,微软向后兼容

    *

    7 保留供以后定义使用

    *

    *

    * @return 此 {@code UUID} 相关联的变体号*/

    public intvariant()

    {//This field is composed of a varying number of bits.//0 - - Reserved for NCS backward compatibility//1 0 - The IETF aka Leach-Salz variant (used by this class)//1 1 0 Reserved, Microsoft backward compatibility//1 1 1 Reserved for future definition.

    return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));

    }/**

    * 与此 UUID 相关联的时间戳值。

    *

    *

    * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。

    * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。

    *

    *

    * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。

    * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。

    *

    * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。*/

    public longtimestamp() throws UnsupportedOperationException

    {

    checkTimeBase();return (mostSigBits & 0x0FFFL) << 48// | ((mostSigBits >> 16) & 0x0FFFFL) << 32// | mostSigBits >>> 32;

    }/**

    * 与此 UUID 相关联的时钟序列值。

    *

    *

    * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。

    *

    * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出

    * UnsupportedOperationException。

    *

    * @return 此 {@code UUID} 的时钟序列

    *

    * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1*/

    public intclockSequence() throws UnsupportedOperationException

    {

    checkTimeBase();return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);

    }/**

    * 与此 UUID 相关的节点值。

    *

    *

    * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。

    *

    * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。

    * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。

    *

    * @return 此 {@code UUID} 的节点值

    *

    * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1*/

    public longnode() throws UnsupportedOperationException

    {

    checkTimeBase();return leastSigBits & 0x0000FFFFFFFFFFFFL;

    }/**

    * 返回此{@code UUID} 的字符串表现形式。

    *

    *

    * UUID 的字符串表示形式由此 BNF 描述:

    *

    *

    
     

    * {@code

    * UUID = ----

    * time_low = 4*

    * time_mid = 2*

    * time_high_and_version = 2*

    * variant_and_sequence = 2*

    * node = 6*

    * hexOctet =

    * hexDigit = [0-9a-fA-F]

    * }

    *

    *

    *

    *

    * @return 此{@code UUID} 的字符串表现形式

    * @see #toString(boolean)*/@OverridepublicString toString()

    {return toString(false);

    }/**

    * 返回此{@code UUID} 的字符串表现形式。

    *

    *

    * UUID 的字符串表示形式由此 BNF 描述:

    *

    *

    
     

    * {@code

    * UUID = ----

    * time_low = 4*

    * time_mid = 2*

    * time_high_and_version = 2*

    * variant_and_sequence = 2*

    * node = 6*

    * hexOctet =

    * hexDigit = [0-9a-fA-F]

    * }

    *

    *

    *

    *

    * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串

    * @return 此{@code UUID} 的字符串表现形式*/

    publicString toString(boolean isSimple)

    {

    final StringBuilder builder= new StringBuilder(isSimple ? 32 : 36);//time_low

    builder.append(digits(mostSigBits >> 32, 8));if (false ==isSimple)

    {

    builder.append('-');

    }//time_mid

    builder.append(digits(mostSigBits >> 16, 4));if (false ==isSimple)

    {

    builder.append('-');

    }//time_high_and_version

    builder.append(digits(mostSigBits, 4));if (false ==isSimple)

    {

    builder.append('-');

    }//variant_and_sequence

    builder.append(digits(leastSigBits >> 48, 4));if (false ==isSimple)

    {

    builder.append('-');

    }//node

    builder.append(digits(leastSigBits, 12));returnbuilder.toString();

    }/**

    * 返回此 UUID 的哈希码。

    *

    * @return UUID 的哈希码值。*/@Overridepublic inthashCode()

    {long hilo = mostSigBits ^leastSigBits;return ((int) (hilo >> 32)) ^ (int) hilo;

    }/**

    * 将此对象与指定对象比较。

    *

    * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。

    *

    * @param obj 要与之比较的对象

    *

    * @return 如果对象相同,则返回 {@code true};否则返回 {@code false}*/@Overridepublicboolean equals(Object obj)

    {if ((null == obj) || (obj.getClass() != UUID.class))

    {return false;

    }

    UUID id=(UUID) obj;return (mostSigBits == id.mostSigBits && leastSigBits ==id.leastSigBits);

    }//Comparison Operations

    /**

    * 将此 UUID 与指定的 UUID 比较。

    *

    *

    * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。

    *

    * @param val 与此 UUID 比较的 UUID

    *

    * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。

    **/@Overridepublic intcompareTo(UUID val)

    {//The ordering is intentionally set up so that the UUIDs//can simply be numerically compared as two numbers

    return (this.mostSigBits < val.mostSigBits ? -1 : // (this.mostSigBits > val.mostSigBits ? 1 : // (this.leastSigBits < val.leastSigBits ? -1 : // (this.leastSigBits > val.leastSigBits ? 1 : // 0))));

    }//-------------------------------------------------------------------------------------------------------------------//Private method start

    /**

    * 返回指定数字对应的hex值

    *

    * @param val 值

    * @param digits 位

    * @return 值*/

    private static String digits(long val, intdigits)

    {long hi = 1L << (digits * 4);return Long.toHexString(hi | (val & (hi - 1))).substring(1);

    }/**

    * 检查是否为time-based版本UUID*/

    private voidcheckTimeBase()

    {if (version() != 1)

    {throw new UnsupportedOperationException("Not a time-based UUID");

    }

    }/**

    * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG)

    *

    * @return {@link SecureRandom}*/

    public staticSecureRandom getSecureRandom()

    {try{return SecureRandom.getInstance("SHA1PRNG");

    }catch(NoSuchAlgorithmException e)

    {throw newUtilException(e);

    }

    }/**

    * 获取随机数生成器对象

    * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。

    *

    * @return {@link ThreadLocalRandom}*/

    public staticThreadLocalRandom getRandom()

    {returnThreadLocalRandom.current();

    }

    }

    展开全文
  • JS生成UUID

    2021-03-03 15:22:52
    它是把硬件地址、时间以及随机数结合在一起,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和...

    一、UUID是什么

    UUID就是Universal Unique IDentifier的缩写,它是一个128位,16字节的值,并确保在时间和空间上唯一。

    它是把硬件地址、时间以及随机数结合在一起,它保证对在同一时空中的所有机器都是唯一的。

    通常平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID (Globals Unique Identifiers)。

    一般情况下,生成算法用计算机网卡的地址和一个60位的timestamp生成,时间是以100ns为时间间隔。

    例如,一台300PL 6862的计算机,主板集成的网卡的MAC地址为00-04-AC-2E-B7-DC,而UUID的最后六个字节也会是0004AC2EB7DC

    一般我们都知道使用Java如何创建UUID,如下:

    java类:java.util.UUID

    UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID

    import java.util.UUID;

    public class TestGUID {

    public static void main(String[] args) {//用main方法是为了测试方便

    UUID uuid = UUID.randomUUID(); //实际项目中只有这句有用

    System.out.println (uuid);

    }

    }

    编译运行输出如:c9d6294f-0c62-453f-8626-68c7b0fc9769

    二、JS生成UUID

    如果想在js中使用uuid我们可以使用如下方法生成:

    /*!

    Math.uuid.js (v1.4)

    http://www.broofa.com

    mailto:robert@broofa.com

    Copyright (c) 2010 Robert Kieffer

    Dual licensed under the MIT and GPL licenses.

    */

    /*

    * Generate a random uuid.

    *

    * USAGE: Math.uuid(length, radix)

    * length - the desired number of characters

    * radix - the number of allowable values for each character.

    *

    * EXAMPLES:

    * // No arguments - returns RFC4122, version 4 ID

    * >>> Math.uuid()

    * "92329D39-6F5C-4520-ABFC-AAB64544E172"

    *

    * // One argument - returns ID of the specified length

    * >>> Math.uuid(15) // 15 character ID (default base=62)

    * "VcydxgltxrVZSTV"

    *

    * // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)

    * >>> Math.uuid(8, 2) // 8 character ID (base=2)

    * "01001010"

    * >>> Math.uuid(8, 10) // 8 character ID (base=10)

    * "47473046"

    * >>> Math.uuid(8, 16) // 8 character ID (base=16)

    * "098F4D35"

    */

    (function() {

    // Private array of chars to use

    var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');

    Math.uuid = function (len, radix) {

    var chars = CHARS, uuid = [], i;

    radix = radix || chars.length;

    if (len) {

    // Compact form

    for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];

    } else {

    // rfc4122, version 4 form

    var r;

    // rfc4122 requires these characters

    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';

    uuid[14] = '4';

    // Fill in random data. At i==19 set the high bits of clock sequence as

    // per rfc4122, sec. 4.1.5

    for (i = 0; i < 36; i++) {

    if (!uuid[i]) {

    r = 0 | Math.random()*16;

    uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];

    }

    }

    }

    return uuid.join('');

    };

    // A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance

    // by minimizing calls to random()

    Math.uuidFast = function() {

    var chars = CHARS, uuid = new Array(36), rnd=0, r;

    for (var i = 0; i < 36; i++) {

    if (i==8 || i==13 || i==18 || i==23) {

    uuid[i] = '-';

    } else if (i==14) {

    uuid[i] = '4';

    } else {

    if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;

    r = rnd & 0xf;

    rnd = rnd >> 4;

    uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];

    }

    }

    return uuid.join('');

    };

    // A more compact, but less performant, RFC4122v4 solution:

    Math.uuidCompact = function() {

    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {

    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);

    return v.toString(16);

    });

    };

    })();

    三、JS中生成Guid

    全局唯一标识符,简称GUID(发音为 /ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数。GUID一词有时也专指微软对UUID标准的实现。

    GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数也足够大,达到了2128(3.4×1038)个,所以随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。

    下面是生成Guid代码实现,优点是代码量极少:

    // Generate four random hex digits.

    function S4() {

    return (((1+Math.random())*0x10000)|0).toString(16).substring(1);

    };

    // Generate a pseudo-GUID by concatenating random hexadecimal.

    function guid() {

    return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());

    };

    下面是几种生成Guid的算法来自(http://www.cnblogs.com/snandy/p/3261754.html)

    1、

    function uuid() {

    var s = [];

    var hexDigits = "0123456789abcdef";

    for (var i = 0; i < 36; i++) {

    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);

    }

    s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010

    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01

    s[8] = s[13] = s[18] = s[23] = "-";

    var uuid = s.join("");

    return uuid;

    }

    2.

    function guid() {

    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {

    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);

    return v.toString(16);

    });

    }

    3、

    这个可以指定长度和基数:

    展开全文
  • 重复消息为什么会出现消息重复?消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复。1.1 生产时消息重复由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收...

    一 重复消息

    为什么会出现消息重复?消息重复的原因有两个:1.生产时消息重复,2.消费时消息重复。

    1.1 生产时消息重复

    由于生产者发送消息给MQ,在MQ确认的时候出现了网络波动,生产者没有收到确认,实际上MQ已经接收到了消息。这时候生产者就会重新发送一遍这条消息。

    生产者中如果消息未被确认,或确认失败,我们可以使用定时任务+(redis/db)来进行消息重试。

    @Component

    @Slf4J

    public class SendMessage {

    @Autowired

    private MessageService messageService;

    @Autowired

    private RabbitTemplate rabbitTemplate;

    // 最大投递次数

    private static final int MAX_TRY_COUNT = 3;

    /**

    * 每30s拉取投递失败的消息, 重新投递

    */

    @Scheduled(cron = "0/30 * * * * ?")

    public void resend() {

    log.info("开始执行定时任务(重新投递消息)");

    List msgLogs = messageService.selectTimeoutMsg();

    msgLogs.forEach(msgLog -> {

    String msgId = msgLog.getMsgId();

    if (msgLog.getTryCount() >= MAX_TRY_COUNT) {

    messageService.updateStatus(msgId, Constant.MsgLogStatus.DELIVER_FAIL);

    log.info("超过最大重试次数, 消息投递失败, msgId: {}", msgId);

    } else {

    messageService.updateTryCount(msgId, msgLog.getNextTryTime());// 投递次数+1

    CorrelationData correlationData = new CorrelationData(msgId);

    rabbitTemplate.convertAndSend(msgLog.getExchange(), msgLog.getRoutingKey(), MessageHelper.objToMsg(msgLog.getMsg()), correlationData);// 重新投递

    log.info("第 " + (msgLog.getTryCount() + 1) + " 次重新投递消息");

    }

    });

    log.info("定时任务执行结束(重新投递消息)");

    }

    }

    1.2消费时消息重复

    消费者消费成功后,再给MQ确认的时候出现了网络波动,MQ没有接收到确认,为了保证消息被消费,MQ就会继续给消费者投递之前的消息。这时候消费者就接收到了两条一样的消息。

    修改消费者,模拟异常

    @RabbitListener(queuesToDeclare = @Queue(value = "javatrip", durable = "true"))

    public void receive(String message, @Headers Map headers, Channel channel) throws Exception{

    System.out.println("重试"+System.currentTimeMillis());

    System.out.println(message);

    int i = 1 / 0;

    }

    配置yml重试策略

    spring:

    rabbitmq:

    listener:

    simple:

    retry:

    enabled: true # 开启消费者进行重试

    max-attempts: 5 # 最大重试次数

    initial-interval: 3000 # 重试时间间隔

    由于重复消息是由于网络原因造成的,因此不可避免重复消息。但是我们需要保证消息的幂等性。

    二 如何保证消息幂等性

    让每个消息携带一个全局的唯一ID,即可保证消息的幂等性,具体消费过程为:

    消费者获取到消息后先根据id去查询redis/db是否存在该消息

    如果不存在,则正常消费,消费完毕后写入redis/db

    如果存在,则证明消息被消费过,直接丢弃。

    生产者

    @PostMapping("/send")

    public void sendMessage(){

    JSONObject jsonObject = new JSONObject();

    jsonObject.put("message","Java旅途");

    String json = jsonObject.toJSONString();

    Message message = MessageBuilder.withBody(json.getBytes()).setContentType(MessageProperties.CONTENT_TYPE_JSON).setContentEncoding("UTF-8").setMessageId(UUID.randomUUID()+"").build();

    amqpTemplate.convertAndSend("javatrip",message);

    }

    消费者

    @Component

    @RabbitListener(queuesToDeclare = @Queue(value = "javatrip", durable = "true"))

    public class Consumer {

    @RabbitHandler

    public void receiveMessage(Message message) throws Exception {

    Jedis jedis = new Jedis("localhost", 6379);

    String messageId = message.getMessageProperties().getMessageId();

    String msg = new String(message.getBody(),"UTF-8");

    System.out.println("接收到的消息为:"+msg+"==消息id为:"+messageId);

    String messageIdRedis = jedis.get("messageId");

    if(messageId == messageIdRedis){

    return;

    }

    JSONObject jsonObject = JSONObject.parseObject(msg);

    String email = jsonObject.getString("message");

    jedis.set("messageId",messageId);

    }

    }

    如果需要存入db的话,可以直接将这个ID设为消息的主键,下次如果获取到重复消息进行消费时,由于数据库主键的唯一性,则会直接抛出异常。

    展开全文
  • 1、网上例子: https://blog.csdn.net/zheng2780071070/article/details/107692978 https://www.cnblogs.com/haiyan123/p/9752813.html https://www.cnblogs.com/franknihao/p/7307224.html ... 取uuid的前16字符...
  • UUID

    2021-10-14 06:11:42
    UUID,是Universally Unique Identifier的缩写,UUID出现的目的,是为了让分布式系统可以借助中心节点,就可以生成UUID来标识一些唯一的信息; GUID,是Globally Unique Identifier的缩写,跟UUID是同一个东西,...
  • UUID是通用唯一识别码(Universally Unique ...如此一来,就需考虑数据库建立时的名称重复问题. 目前最广泛应用的 UUID,即是微软的 Microsoft’s Globally Unique Identifiers (GUIDs),而其他重要的应用,则...
  • 实际是需要传参数的,这里随便传一个str参数即可 function uuid = UUID(str) str=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']; uuid1=string();...
  • Java随机数和UUID

    2021-02-12 20:39:02
    Java随机数和UUID#Java随机数在Java项目中通常是通过Math.random方法和Random类来获得随机数,前者通过生成一个Random类的实例来实现。此类产生的是一组伪随机数流,通过使用 48 位的种子,利用线性同余公式产生。在...
  • MySQL 自增主键和UUID

    2021-02-02 14:23:21
    插入前1)UUID 需要手动维护,要求是保证每次生成的数据都是一致的,然后我们需要手写sql插入,如果代码逻辑中含有大量这种非业务相关的代码,其实是很友好的,所以尽量透明。但是在代码中(Java)你可以在未插入...
  • Java生成UUID

    2021-03-03 12:10:17
    UUID具有以下涵义:经由一定的算法机器生成为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其...
  • Oracle 生成uuid,查询uuid

    2021-05-07 04:46:09
    如果已经创建了表,那么先保证你原有的主键ID没有任何实际的业务意义,要修改的话使用下面的方法。alter table testuu modify id default sys_guid() ;update testuu set id = sys_guid ();Oracle新建系统表时,要求...
  • 关于UUID

    2021-11-24 00:24:16
    如此一来,每个人都可以创建与其它人冲突的 UUID。 组成 UUID共有5部分组成:xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx,表现形式为8-4-4-4-12的32个字符。 如:df623885-68f9-47e0-b13c-bbd9600b6e71 1
  • mysql 随机不重复ID如何在建表的时候 如何让主键字段 产生一个随机不重复8位无符号整数------解决方案--------------------八位最多一千万的数据 用rand随机多了怎么可能不重复1 用自增id2 用uuid函数------解决方案...
  • java如何生成12位永远不重复的数字

    千次阅读 2021-02-13 00:28:17
    用锁对象或者把方法声明为synchronized保证并发也不会重复。如果有用数据库,也可以用数据库提供的sequence来帮你生成。 扩展资料: 当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如...
  • 服务器uuid修改

    2021-08-13 03:22:39
    服务器uuid修改 内容精选换一换子网创建好后,网段是支持修改的。如需修改子网网段可以通过更换子网来实现。云服务器已关机。登录管理控制台。选择“计算 > 弹性云服务器”。在弹性云服务器列表中的右上角,...
  • uuid生成纯数字

    2021-12-07 09:37:37
    public static String getUUID(){ return UUID.randomUUID().toString().replace("-",""); } public static Integer getUUIDInOrderId(){ for (int i = 0; i<100; i++){ Integer orderId=UUID.randomUUID()....
  • 在分布式系统中经常会使用到生成全局唯一不重复ID的情况。本篇博客介绍生成的一些方法。常见的一些方式:1、通过DB做全局自增操作优点:简单、高效缺点:大并发、分布式情况下性能比较低有些同学可能会说分库、分表...
  • UUID详细介绍

    千次阅读 2021-01-25 15:02:39
    如此一来,每个人都可以创建与其它人冲突的 UUID,就需考虑数据库创建时的名称重复问题。其作用视场景而定。 UUID定义 UUID使用16进制表示,共有36个字符(32个字母数字+4个连接符"-")组成,格式为8-4-4-4-12;...
  • 深入分析mysql为什么不推荐使用uuid或者雪花id作为主键 前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么...
  • 今天我们介绍一下如何在 SQLite 中生成随机数据,包括随机数字、手机验证码、随机字符串、随机日期和时间、UUID 以及返回表中的随机记录等。
  • import java.util.UUID; public class generateShortUuid { public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", ...
  • 一、Java1.UUID 简介UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。也是被开源软件基金会 (Open Software Foundation, OSF)的组织应用在分布式计算环境 (Distributed ...
  • UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码...
  • 分库分表下uuid的生成

    2021-02-07 13:25:25
    当然,如果我们用"业务标识号+用户唯一标识+当前时间"也是可以达到uuid的目的的,但用户唯一标识是敏感信息且可能太方便处理为数字,所以弄一套uuid生成服务是很有必要的。本文就来研究下怎...
  • 系统出现了两个一模一样的订单号,订单的内容却不是一样的,而且系统在按照订单号查询的时候一直抛错,也没法正常回调,而且事情发生的不止一次,所以这次系统升级一定要解决掉。经手的同事之前也改过几次,不过...
  • 工作中难免会碰到要生成一个不重复的数字来充当id的需求,这时候你会怎么办,使用UUID?还是使用当前时间节点拼接随机数?今天就来为大家推荐一个非常好用的算法:雪花算法。 雪花算法: 是由符号位+时间戳+工作...
  • 因为这个圆圈太乱了,所以设备本身的任何标识都能直接用作设备的唯一标识. iOS受到系统强大限制的独特认可. 目前,唯一可以部分满足条件的部分是IDFA,但这要求您的App本身必须嵌入广告.当许多开发人员使用...
  • 我使用UUID.randomUUID().toString()将一个唯一值附加到最终存储在数据库中的字符串,并对其具有唯一约束但是因为我的应用程序是多线程的,所以执行在UUID生成的同时发生,并且最终将相同的UUID附加到字符串并且持久性...
  • 查看centos6.3的UUID

    2020-12-22 01:53:32
    在Centos6版本中,/etc/fstab中的配置开始使用UUID号进行表示。不再向centos5版本中使用LABEL=/boot这样的方式来表示。而像ubuntu之类的Linux版本中也早已使用了UUID号来表示。当然,经过测试,原来老的表示方法也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,676
精华内容 10,270
关键字:

uuid保证不重复