文章目录
- rocketmq:java类详解
- 一、DefaultMQProducer类
- 概述
- 方法
- 二、DefaultMQPushConsumer类
- 概述
- 字段
- 重要字段
- 重要方法
- 三、Message类
- 概述
- 字段
- 关键属性
- 四、MessageExt类
- 概述
- 字段
rocketmq:java类详解
一、DefaultMQProducer类
概述
DefaultMQProducer类是应用发送消息使用的基类,封装一些通用的方法方便开发者在更多场景中使用。属于线程安全类,在配置并启动后可在多个线程间共享此对象。
可以通过无参构造方法快速创建一个生产者,通过getter/setter方法,调整发送者的参数。主要负责消息的发送,支持同步/异步/oneway的发送方式,这些发送方式均支持批量发送
方法
属性 | 内容 |
DefaultMQProducerImpl defaultMQProducerImpl; | 生产者内部默认实现类 |
String producerGroup; | Producer组名, 默认值为DEFAULT_PRODUCER。多个Producer如果属于一个应用,发送同样的消息,则应该将它们归为同一组。 |
String createTopicKey; | 自动创建测试的topic名称, 默认值为TBW102;在发送消息时,自动创建服务器不存在的topic,需要指定Key。broker必须开启isAutoCreateTopicEnable |
int defaultTopicQueueNums; | 创建默认topic的queue数量。默认4 |
int sendMsgTimeout; | 发送消息超时时间,默认值3000,单位毫秒 |
int compressMsgBodyOverHowmuch; | 消息体压缩阈值,默认为4k(Consumer收到消息会自动解压缩) |
int retryTimesWhenSendFailed; | 同步模式,返回发送消息失败前内部重试发送的最大次数。可能导致消息重复。默认2 |
int retryTimesWhenSendAsyncFailed; | 异步模式,返回发送消息失败前内部重试发送的最大次数。可能导致消息重复。默认2 |
boolean retryAnotherBrokerWhenNotStoreOK; | 声明发送失败时,下次是否投递给其他Broker,默认false |
int maxMessageSize; | 最大消息大小。默认4M; 客户端限制的消息大小,超过报错,同时服务端也会限制 |
TraceDispatcher traceDispatcher | 消息追踪器,定义了异步传输数据接口。使用rcpHook来追踪消息 |
二、DefaultMQPushConsumer类
概述
DefaultMQPushConsumer类是rocketmq客户端消费者的实现,从名字上已经可以看出其消息获取方式为broker往消费端推送数据,其内部实现了流控,消费位置上报等等。DefaultMQPushConsumer是Push消费模式下的默认配置
字段
字段 | 内容 |
DefaultMQPushConsumerImpl defaultMQPushConsumerImpl; | 消费者实现类,所有的功能都委托给DefaultMQPushConsumerImpl来实现 |
String consumerGroup; | 消费者组名,必须设置,参数默认值是:DEFAULT_CONSUMER (需要注意的是,多个消费者如果具有同样的组名,那么这些消费者必须只消费同一个topic) |
MessageModel messageModel; | 消费的方式,支持以下两种 1、集群消费 2、广播消费。BROADCASTING 广播模式,即所有的消费者可以消费同样的消息CLUSTERING 集群模式,即所有的消费者平均来消费一组消息 |
ConsumeFromWhere consumeFromWhere; | 消费者从那个位置消费,分别为:CONSUME_FROM_LAST_OFFSET:第一次启动从队列最后位置消费,后续再启动接着上次消费的进度开始消费 ;CONSUME_FROM_FIRST_OFFSET:第一次启动从队列初始位置消费,后续再启动接着上次消费的进度开始消费;CONSUME_FROM_TIMESTAMP:第一次启动从指定时间点位置消费,后续再启动接着上次消费的进度开始消费(以上所说的第一次启动是指从来没有消费过的消费者,如果该消费者消费过,那么会在broker端记录该消费者的消费位置,如果该消费者挂了再启动,那么自动从上次消费的进度开始) |
AllocateMessageQueueStrategy allocateMessageQueueStrategy; | 消息分配策略,用于集群模式下,消息平均分配给所有客户端;默认实现为AllocateMessageQueueAveragely |
Map<String, String> subscription; | topic对应的订阅tag |
MessageListener messageListener; | 消息监听器 ,处理消息的业务就在监听里面。目前支持的监听模式包括:MessageListenerConcurrently,对应的处理逻辑类是MessageListener messageListener ;ConsumeMessageConcurrentlyServiceMessageListenerOrderly 对应的处理逻辑类是ConsumeMessageOrderlyService;两者使用不同的ACK机制。RocketMQ提供了ack机制,以保证消息能够被正常消费。发送者为了保证消息肯定消费成功,只有使用方明确表示消费成功,RocketMQ才会认为消息消费成功。中途断电,抛出异常等都不会认为成功——即都会重新投递。上面两个不同的监听模式使用的ACK机制是不一样的。 |
OffsetStore offsetStore; | offset存储实现,分为本地存储或远程存储 。集群消费:从远程Broker获取。广播消费:从本地文件获取。 |
重要字段
int consumeThreadMin = 20 线程池自动调整
int consumeThreadMax = 64 线程池自动调整
long adjustThreadPoolNumsThreshold = 100000
int consumeConcurrentlyMaxSpan = 2000
单队列并行消费最大跨度,用于流控
int pullThresholdForQueue = 1000
一个queue最大消费的消息个数,用于流控
long pullInterval = 0 检查拉取消息的间隔时间,由于是长轮询,所以为 0,但是如果应用为了流控,
也可以设置大于 0 的值,单位毫秒,取值范围: [0, 65535]
consumeMessageBatchMaxSize = 1 并发消费时,一次消费消息的数量,默认为1,
假如修改为50,此时若有100条消息,那么会创建两个线程,每个线程分配50条消息。
换句话说,批量消费最大消息条数,取值范围: [1, 1024]。默认是1
pullBatchSize = 32 消费者去broker拉取消息时,一次拉取多少条。取值范围: [1, 1024]。默认是32 。可选配置
boolean postSubscriptionWhenPull = false
boolean unitMode = false
重要方法
subscribe(String topic, String subExpression)
订阅某个topic,subExpression传*为订阅该topic所有消息
registerMessageListener(MessageListenerConcurrently messageListener)
注册消息回调,如果需要顺序消费,需要注册MessageListenerOrderly的实现
start 启动消息消费
三、Message类
概述
Producer发送的消息定义为Message类,在org.apache.rocketmq.common.message
包下
字段
字段 | 解释 |
String topic; | Message都有Topic这一属性,Producer发送指定Topic的消息,Consumer订阅Topic下的 消息。 通过Topic字段,Producer会获取消息投递的路由信息,决定发送给哪个Broker |
int flag; | 网络通信层标记。 |
Map<String, String> properties; | 存储了Message其余各项参数,比如tag、key等关键的消息属性。RocketMQ预定义了一组内置属性,除了内置属性之外,还可以设置任意自定义属性。当然属性的数量也是有限的,消息序列化之后的大小不能超过预设的最大消息大小。系统内置属性定义于org.apache.rocketmq.common.message.MessageConst |
byte[] body; | Producer要发送的实际消息内容,以字节数组形式进行存储。Message消息有一定大小限制 |
String transactionId; | RocketMQ 4.3.0引入的事务消息相关的事务编号 |
关键属性
属性 | 接口 | 用途 |
MessageConst.PROPERTY_TAGS | setTags | 在消费消息时可以通过tag进行消息过滤判定 |
MessageConst.PROPERTY_KEYS | setKeys | 可以设置业务相关标识,用于消费 处理判定,或消息追踪查询 |
MessageConst.PROPERTY_DELAY_TIME_LEVEL | setDelayTimeLevel | 消息延迟处理级别,不同级别对应不同延迟时间 |
MessageConst.PROPERTY_WAIT_STORE_MSG_OK | setWaitStoreMsgOK | 在同步刷盘情况下是否需要等待数 。据落地才认为消息发送成功 |
四、MessageExt类
概述
对于发送方来说,上述Message的定义以足够。但对于RocketMQ的整个处理流程来说, 还需要更多的字段信息用以记录一些必要内容,比如消息的id、创建时间、存储时间等 等。在同package下可以找到与之相关的其余类定义
字段
字段 | 用途 |
queueId | 记录MessageQueue编号,消息会被发送到Topic下的MessageQueue |
storeSize | 记录消息在Broker存盘大小 |
queueOffset | 记录在ConsumeQueue中的偏移 |
sysFlag | 记录一些系统标志的开关状态,MessageSysFlag中定义了系统标识 |
bornTimestamp | 消息创建时间,在Producer发送消息时设置 |
storeHost | 记录存储该消息的Broker地址 |
msgId | 消息Id |
commitLogOffset | 记录在Broker中存储便宜 |
bodyCRC | 消息内容CRC校验值 |
reconsumeTimes | 消息重试消费次数 |
preparedTransactionOffset | 事务详细相关字段 |