ActiveMQ消息发送/消费流程图
2020-06-05 15:43:13 28 举报
ActiveMQ消息发送/消费流程图
作者其他创作
大纲/内容
MessageAck
2
1.producer.send( )方法,默认是异步发送,在发送过程中,会判断producerWindow是否有空间
2.如果说没有空间,则它会处于阻塞(Blocking)状态
ActiveMQ消息发送流程图
13.返回一个ack之后,会做两件事情: 13.1会异步的发起一个ACK调度,发送ack给到broker,告诉我们当前消息已经被消费完 13.2同时会将message返回给consumer.receive()
否
9
Block阻塞
是
5
ActiveMQ消息消费流程图
response
6.如果是异步发送,会增加producerWindow的空间大小
10.会获取一个message,此时会调用beforeMessageIsConsumed() 和 afterMessageIsConsumed( )两个方法
结束
消息消费,会调用consumer.receive()方法来作为一个入口
Blocking
send
解除阻塞
4.broker会给transport一个push消息
12.此时会发起一个MessageAck的操作,返回一个ack
4
异步发送
request
onProducerACK
10
6
Broker
8
unconsumedMessages去dequeue
增加producerWindow
13.2
7
push消息
11.此时会调用beforeMessageIsConsumed() 和 afterMessageIsConsumed( )两个方法,将message添加到delivered队列
5.通过unconsumed队列去dequeue读取消息
pull命令
consumer.receive
7.什么时候接触阻塞?(第4部)当ActiveMQ 通过transport通道push消息过来之后,会有一个enqueue的过程,服务端会把数据通过传输层push到unconsumedMessages队列中。
8.同步发送的情况下,会经过传输层,此时会处于阻塞(Blocking)状态
8.此时,阻塞就会被解除
transport
添加到delivered队列
9.如果unconsumed队列不为空的话,此时会拿到一个MessageDispatch的对象(这是一个消息分发对象)
MessageProducer.send( )
Transport
12
pull消息
3.通过传输层,发送一个pull命令至broker上
ActiveMQ
enqueue
3
获取MessageDispatch
9.消息最终,还是会发送至Broker,最后Broker再返回相关数据
4.此时Blocking状态,又会恢复为一个可运行状态
prefetchSize = 0和unconsumedMessages为空
1
7.再会通过传输层,去发送消息至Broker上.至此,异步发送结束
6.如果队列为空,将会阻塞
1.会去判断prefetchSize和unconsumedMessages
2.如果为空,发起一个pull命令,去调用transport通道
获取一个message
队列为空
13
13.1
producerWindow是否有空间
reponse读取到数据
11
5.如果producerWindow存在空间大小的话,会再次判断是不是异步发送。其实在步骤1中就已经有一个判断了。默认是异步发送的,只有异步发送,CIA会存在producerWindow这个概念
0 条评论
下一页