Я обнаружил интересное поведение ... Я не могу решить, ошибка это или некомпетентность, но в настоящее время склоняюсь к некомпетентности.
Этот код не войдет в цикл, даже если есть ожидающие сообщения:
Message msg;
while ((msg = consumer.receiveNoWait()) != null) {
System.out.println(msg);
}
Этот код ДЕЙСТВИТЕЛЬНО входит в цикл, обратите внимание на нулевое назначение:
Message msg = null;
while ((msg = consumer.receiveNoWait()) != null) {
System.out.println(msg);
}
Этот код работает на Glassfish 3.1.1b10 HotSpot 1.6_26 на 32-битной Windows . Я не могу придумать объяснения, почему первый блок не работает!
РЕДАКТИРОВАТЬ / ОБНОВЛЕНИЕ 13 июля 2011 г .:
Во-первых, я начал останавливать домен Glassfish и удалять его между развертываниями по запросу, и это все еще происходит :)
Во-вторых, я не могу выполнить синхронизацию на Destination или Consumer, так как это код Java EE. Но я могу заверить, что сообщения доступны. Их в наличии около 500 и нет потребителей. Фактически создание QueueBrowser говорит мне, что сообщения доступны!
В-третьих, эта программа печатает «РАБОТАЕТ!» каждый раз!!! АРГХ !!!
public static void main(String[] args) {
Object obj;
if ((obj = getNotNull()) != null) {
System.out.println("worked!");
} else {
System.out.println("failed!");
}
}
static Object getNotNull() {
return new Object();
}
Напоследок я говорил о собственной некомпетентности. ;)