activemq提供的客户端分离了消息的读取以及接收,以Queue模式为例,这其中的中介就是ActiveMQMessageConsumer的unconsumedMessages属性(MessageDispatchChannel unconsumedMessages,该属性存储了将要被发送的消息),下面就以ActiveMQMessageConsumer:receive为例来说明读取消息:
代码语言:javascript复制 public Message receive() throws JMSException {
checkClosed();
checkMessageListener();
sendPullCommand(0);
MessageDispatch md = dequeue(-1);
if (md == null) {
return null;
}
beforeMessageIsConsumed(md);
afterMessageIsConsumed(md, false);
return createActiveMQMessage(md);
}
从上面的代码可以看到receive读取方法会先调用sendPullCommand方法向provider发送一条拉取消息的命令,provider在收到相应的命令后如果有消息则会把消息发送给该消费者,dequeue方法就是从unconsumedMessages读取消息的!