Java 生成随机UUID非阻塞

Java 生成随机UUID非阻塞,java,reactive-programming,uuid,spring-webflux,project-reactor,Java,Reactive Programming,Uuid,Spring Webflux,Project Reactor,通过使用Blockhound io.projectreactor.tools Blockhound junit平台,我发现UUID.randomUUID是一个阻塞调用,这对我们来说是一个问题,因为我们使用的是Spring boot Webflux版本2.2.2.RELEASE 是否有任何其他方法以非阻塞方式获取随机uuid,或者是否有任何其他java库建议以非阻塞方式生成随机字符串 来自blockhound的堆栈跟踪: java.lang.Error: Blocking call! java.i

通过使用Blockhound io.projectreactor.tools Blockhound junit平台,我发现UUID.randomUUID是一个阻塞调用,这对我们来说是一个问题,因为我们使用的是Spring boot Webflux版本2.2.2.RELEASE

是否有任何其他方法以非阻塞方式获取随机uuid,或者是否有任何其他java库建议以非阻塞方式生成随机字符串

来自blockhound的堆栈跟踪:

java.lang.Error: Blocking call! java.io.FileInputStream#readBytes
at reactor.blockhound.BlockHound$Builder.lambda$new$0(BlockHound.java:196) ~[blockhound-1.0.1.RELEASE.jar:na]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
|_ checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain][ExceptionHandlingWebHandler]
Stack trace:
    at reactor.blockhound.BlockHound$Builder.lambda$new$0(BlockHound.java:196) ~[blockhound-1.0.1.RELEASE.jar:na]
    at reactor.blockhound.BlockHound$Builder.lambda$install$6(BlockHound.java:318) ~[blockhound-1.0.1.RELEASE.jar:na]
    at reactor.blockhound.BlockHoundRuntime.checkBlocking(BlockHoundRuntime.java:46) ~[na:na]
    at java.base/java.io.FileInputStream.readBytes(FileInputStream.java) ~[na:na]
    at java.base/java.io.FileInputStream.read(FileInputStream.java:279) ~[na:na]
    at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133) ~[na:na]
    at java.base/sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424) ~[na:na]
    at java.base/sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(NativePRNG.java:526) ~[na:na]
    at java.base/sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:545) ~[na:na]
    at java.base/sun.security.provider.NativePRNG.engineNextBytes(NativePRNG.java:220) ~[na:na]
    at java.base/java.security.SecureRandom.nextBytes(SecureRandom.java:741) ~[na:na]
    at java.base/java.util.UUID.randomUUID(UUID.java:150) ~[na:na]

这真的是个问题吗?在较旧的Linux版本上,从OS随机数源获取足够的随机字节曾经是个问题,但现在应该很快了。也许这只会在您第一次生成UUID时发生?请参阅此线程,了解有关默认熵源为何会变慢以及如何选择不同的熵源的讨论:如果您确实遇到了变慢的情况,并且不想阻止您的“反应式”线程,您可以在专用工作线程池上生成所有UUID,和其他阻塞的东西一样。但这似乎太过分了。谢谢你的回答。阻塞调用不应用于反应式程序,即使它们很快。我同意创建一个单独的线程池来生成uuid似乎有些过分。没有其他库可用于生成推荐用于反应式应用程序的随机id?这没有问题(除非SecureRandom的种子设定速度非常慢)。类加载也是阻塞的。不要陷入过早的“优化”陷阱,关注可证明的性能问题。