我正在使用Glassfish JMS。
我可以将消息添加到队列中。 我可以使用QueueBrowser对象查看消息。 但是,MessageConsumer(也不是QueueReceiver)无法接收任何消息并返回null。 消息过期设置为0,我记得打开连接。
有什么想法吗?
以下是代码:
Session session = null;
Connection conn = null;
try
{
InitialContext jndi = new InitialContext();
ConnectionFactory qFactory = (ConnectionFactory)jndi.
lookup("myConnectionFactory");
conn = qFactory.createConnection();
conn.start();
Queue queue = (Queue)jndi.lookup("myQueueName");
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver mc = ((QueueSession)session).createReceiver(queue);
Object m = mc.receive(2000);
//m is NULL!
QueueBrowser browser = session.createBrowser(queue);
for(Enumeration e = browser.getEnumeration(); e.hasMoreElements(); )
{
//there are many messages here...
}
答案 0 :(得分:1)
拥有客户端代码会很好。
在发送方没有正确提交/关闭连接时,发生了类似的事情。使用管理控制台时,该消息将可见,但尚未提供给MDB。
希望它有所帮助。
答案 1 :(得分:0)
此代码是否在appserver中运行?如果是,我将通过注释获得所需的对象,对于消息接收器,我将使用MDB。 如果这是一段独立的代码,我有一段时间让一个基于JNDI的客户端工作,我恢复使用“原始”Java API。
答案 2 :(得分:0)
我目睹了第一次会话提交后发生的相同行为,这意味着在正确接收的消息之前。在我的情况下,问题是我在保持同一会话的同时重新创建了接收器。 正如this article中指出的那样:
创建临时目的地,消费者,生产者和连接 是所有与代理同步的请求 - 响应操作 应该避免处理每个请求,因为它会产生大量的请求 与JMS经纪人聊天。
解决方案就像重复使用相同的接收器一样简单。