【发布时间】:2011-10-04 01:23:14
【问题描述】:
我发现了一些有趣的行为...我无法确定这是错误还是无能,但目前倾向于无能。
这段代码不会进入循环,即使有消息在等待:
Message msg;
while ((msg = consumer.receiveNoWait()) != null) {
System.out.println(msg);
}
这段代码确实进入了循环,注意空赋值:
Message msg = null;
while ((msg = consumer.receiveNoWait()) != null) {
System.out.println(msg);
}
此代码在 Windows 32 位的 Glassfish 3.1.1b10 HotSpot 1.6_26 上运行。我想不出为什么第一个块不起作用的解释!
2011 年 7 月 13 日编辑/更新:
首先,我开始停止 Glassfish 域并在每次请求的部署之间删除它,这仍然会发生 :)
其次,我无法在 Destination 或 Consumer 上同步,因为这是 Java EE 代码。但是,我可以保证有可用的消息。其中大约有 500 个可用且没有消费者。事实上,创建 QueueBrowser 会告诉我有可用的消息!
第三,这个程序打印“WORKS!”每次!!!啊!!!
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();
}
最后,我说的是我自己的无能。 ;)
【问题讨论】:
-
这取决于
consumer.receiveNoWait()。试试System.out.println(consumer.receiveNoWait() == null) -
对任何过分热心的模组的网站注释:这确实不(我重复:不)属于CGSE。以防万一您因为“挑战”一词而考虑迁移。代表 CGSE 用户感谢您。
-
如果您认为这很糟糕,我可以让来自 Microsoft 的 Java 虚拟机的 JIT 抛出一个不可能的空指针异常。 (Java的VM本身没有出现bug,证明是JIT的错。)
-
代码相同,问题在于
receiveNoWait()以及队列中任何消息的可用性。很简单:如果轮询一个队列并且它是空的,效果将完全一样。 -
@edutesoy 谁的无能* ;)
标签: java jakarta-ee jms