RocketMq快速入门 (三)

发送消息类型:普通消息、顺序消息(实现有序消费)、事务消息(解决分布式事务实现最终一致)

RocketMq有两种消费模式:
DefalutMQPushConsumer:推送模式为consumer请求broker建立起长连接的关系,broker每5秒钟监测是否有消息,如果有就推送数据,使用DefalutMQPushConsumer实现消息消费,broker会主动记录消息消费的偏移量(推荐)
DefaultMQPullConsumer:拉取模式为consumer请求broker,一般本地在使用定时任务实现,获取消息状态方便、负载均衡性能可控,消息及时性变差,需要手动记录消息消费的偏移量信息,减少broker的压力

RocketMq消息中间件,ack机制常见应答状态如下:

LocalTransactionState:主要针对事务消息的应答状态

public enum LocalTransactionState{
    COMMIT_MESSAGE,    //消息提交
    ROLLBACK_MESSAGE,  //消息回滚
    UNKNOW;            //未知状态,一般用户处理超时等现象
}
ConsumeConcurrentlyStatus:主要针对消息消费的应答状态

public enum ConsumeConcurrentlyStatus{
	CONSUME_SUCCESS,  //消息消费成功
	RECONSUME_LATER;  //消息重试,一般消息消费失败后,RocketMq为保证数据的可靠性,具有重试机制
}

重发时间是(broker.log中)

messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

消息发送步骤:

  • 创建DefaultMQProducer
  • 设置NameSrv地址
  • 开启DefaultMQProducer
  • 创建消息Message
  • 发送消息
  • 关闭DefaultMQProducer

消息生产者:

public class Producer{
	public static void main(String[] args){
		//1.创建DefaultMQProducer
		DefaultMQProducer producer = new DefaultMQProducer("demo_producer_group");
		//2.设置Namesrv地址
		producer.setNamesrvAddr("192.168.211.144:9876");
		//3.开启DefaultMQProducer
		producer.start();
		//4.创建消息Message //String topic 主题, String tags 主要用于消息过滤, String keys 消息唯一值, byte[] body 消息内容
		Message message = new Message("topic_demo","tags","keys 1","heelo!".getBytes(RemotingHelper.DEFAULT_CHARSET);
		//5.发送消息
		SendResult result = producer.send(message);
		System.out.println(result);
		//6.关闭DefaultMQProducer
		producer.shutdown();
		
	}
}

消息消费者:

public class Consumer{
	public static void main(String[] args){
		//1.创建DefaultMQPushConsumer
		DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo_consumer_group");
		//2.设置namesrv地址
		consumer.setNamesrvAddr("192.168.211.141:9876");
		//设置消息拉取最大数
		consumer.setConsumeMessageBatchMaxSize(2);
		//3.设置subscribe,这里是要读取的主题信息
		consumer.subscribe("topic_demo",  //指定消费的主题
							"tags || tagsA || tagsB"); //过滤规则
		consumer.setMessageListener(new MessageListenerConcurrently(){
			@Override
			public ConsumeConcurrentlyStatus consumerMessage(List<MessgeExt> msgs, ConsumeConcurrentlyContext context){		
				//4.接收消息
				for(MessageExt msg : msgs){
					//获取主题
					String topic = msgs.getTopic();
					//获取标签
					String tags = msgs.getTags();
					//获取信息
					byte[] body = msg.getBody();
					String result = new String(body,RemotingHelper.DEFAULT_CHARSET);
					System.out.println(result);
				}
				//异常可以返回 ConsumeConcurrentlyStatus.RECONSUME_LATER 消息重试
				return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
			}
		});
		//5.开启Consumer
		consumer.start();
	}
}

顺序消息指的是在指定发送到一个队列里,然后消费者会轮询所有的队列然后进行消费

事务队列:rocketMq不是强一致性,而是最终一致性。
具体流程如下图所示:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值