Я действительно думал, что после того, как 200 или более tomcat установит на разных платформах, я готов к любым вызовам, но это сложно.
Я создал изображение Vanilla Ubunutu 14_04 и установил Java 8 TGZ из oracle в этой системе. Кроме того, я добавил кота 8 в игру. Затем я начал установку сервера ванили.
Вскоре после развертывания приложений по умолчанию, поставляемых с tomcat, я задавался вопросом, что происходит там и какие-то потоки. Это была паршивая нить, которая не позволила кошке начать:
"localhost-startStop-1" #15 daemon prio=5 os_prio=0 tid=0x00007f37c8004800 nid=0x4d6 runnable [0x00007f37b38b3000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:246)
at sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539)
at sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144)
at sun.security.provider.SecureRandom$SeederHolder.<clinit>(SecureRandom.java:192)
at sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:210)
- locked <0x00000000f06e6ce8> (a sun.security.provider.SecureRandom)
at java.security.SecureRandom.nextBytes(SecureRandom.java:457)
- locked <0x00000000f06e71c0> (a java.security.SecureRandom)
at java.security.SecureRandom.next(SecureRandom.java:480)
at java.util.Random.nextInt(Random.java:329)
at org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom(SessionIdGeneratorBase.java:234)
После того, как Google и друзья узнали, что SeedGenerator
, поставляемый с JDK, является источником моей проблемы. Интересно, что иногда SeedGenerator возвращался через несколько минут, а иногда просто зависал (заканчивался энтропия?... проверен через cat /proc/sys/kernel/random/entropy_avail
). После нескольких исследований выяснилось, что переменная конфигурации в $JAVA_HOME$/lib/security/java.security
, называемая securerandom.source
, определяет, что такое источник для Random. В моем случае, или лучше, в oracle JDK 8 для linux, это было /dev/random
. Я не эксперт по Linux (я разработчик Java), но я понял, что /dev/random
может закончиться энтропией (что бы это ни значило), но, возможно, это означает, что в какой-то момент он не может генерировать более случайные числа). Я переключился на /dev/urandom
, и все было в порядке с моим tomcat.
Затем я проверил, как другие установки JDK выглядят как на моем другом сервере, который был диким сочетанием OpenJDK и устаревшей установки Oracle JDK. По крайней мере OpenJDK всегда использовал /dev/urandom
, что может быть ответом, почему у меня никогда не было проблемы раньше.
Теперь на мой вопрос: разумно ли из Oracle полагаться на /dev/random
, когда могут быть угловые случаи, когда OS can not производит больше чисел? Я имею в виду серверы, такие как Tomcat, и многие другие полагаются на SeedGenerator
из JDK, и отладка такого рода ошибок действительно продвинута. Принял меня 2 часа, чтобы добраться до того, где я сейчас.