6

我的应用程序在 Jboss 7.1.1 上运行。我有一个每分钟运行一次的调度程序,需要检查 DLQ 中是否有消息并在数据库中进行一些更新。

我编写了一个消息消费者,它监听预定义的自定义 DLQ。问题是我可以看到自定义 DLQ 中有消息,但consumer.receiveNoWait()总是返回 null。

下面是创建消费者的代码:

/*this is running fine and creating the consumer*/
public DestinationHandlerImpl(ConnectionFactory connectionFactory,
    Destination destination, boolean useTransaction, int delMode,
    boolean isProducer) throws JMSException {
    connection = connectionFactory.createConnection();
    consumer = session.createConsumer(destination);
}

这是使用消息的代码(每分钟运行一次):

/*this always return null, event when there are messages in the queue*/
public <T extends BaseEvent> T recieveMessage()
        throws JMSException {

    Message message = consumer.receiveNoWait(); // ----> always return null!!!

    if (message != null && !(message instanceof ObjectMessage)) {
        throw new IllegalArgumentException(
                "message object has to be of type ObjectMessage");
    }

    // Extract the object from the message
    return message == null ? null : (T) ((ObjectMessage) message).getObject();

}

我使用了调试模式,我可以看到消费者目标属性设置为正确的队列,那么我做错了什么?

4

2 回答 2

12

找到了,我只需要connection.start()在开始消费之前添加。

public <T extends BaseEvent> T recieveMessage()
    throws JMSException {

    connection.start(); // --->**added this line**
    Message message = consumer.receiveNoWait(); 

    if (message != null && !(message instanceof ObjectMessage)) {
        throw new IllegalArgumentException(
            "message object has to be of type ObjectMessage");
    }

    // Extract the object from the message
    return message == null ? null : (T) ((ObjectMessage) message).getObject();
}
于 2012-08-01T14:32:29.200 回答
2

我什至有这个问题connection.start()!我的工作解决方案:

使用receive(long timeout)代替receiveNoWait();

观察:1000 毫秒,因为在一个简单的测试用例中超时工作正常,但为了确保在生产中,我将其配置为 10000 毫秒。就我而言,在迭代消息时,我在收到null(不再有消息)时停止,并且在最后一次调用中,receive(10000) 等待整整 10 秒(显然)。我不得不使用异步方法来缓解该性能问题。


编辑:此外,根据实现(jbm),它可能会预取一些消息(预选以供使用),这使得消息不可用,因为它们处于传递状态。

于 2013-07-23T13:59:11.733 回答