RocketMq-简单使用

  • 生产者
public class TestProducer {
	public static void main(String[] args) throws InterruptedException, MQClientException {
		DefaultMQProducer producer = new DefaultMQProducer();
		producer.setNamesrvAddr("111.x.x.x:9876");
		producer.setProducerGroup("demoProducerGroup");
		producer.setRetryTimesWhenSendFailed(3);//失败的 情况发送10次
		producer.start();
 
		for (int i = 0; i < 10; i++) {
			try {
				Message msg = new Message("demoTopic",// topic
						"",// tag
						("Hello RocketMQ " + i+ "::"+System.currentTimeMillis()).getBytes()// body
				);
				SendResult sendResult = producer.send(msg);
				System.out.println(sendResult);
			} catch (Exception e) {
				e.printStackTrace();
				Thread.sleep(1000);
			}
		}
 
		producer.shutdown();
	}
}
  • 消费者 非有序消费消息
public class TestConsumer {
	
	private String topic="datatransferPackages";//datatransferPackages
	private String tag="*";
	
	private String nameServer="111.x,x,x,:9876";
	private String groupId="packagesComsumerA";
	
	private DefaultMQPushConsumer mqConsumer;

	private volatile boolean consumerisRun = false;
	
	public TestConsumer() {
		mqConsumer = new DefaultMQPushConsumer(groupId);
		mqConsumer.setNamesrvAddr(nameServer);
		mqConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
		mqConsumer.setConsumeMessageBatchMaxSize(1);
		mqConsumer.setConsumeThreadMin(5);
		mqConsumer.setConsumeThreadMax(5);
		System.out.println(mqConsumer.getConsumeThreadMax());
		
	    //consumer.setInstanceName(instanceName);
	}

	public void startRocketMqConsumer(String f) {
		System.out.println("...startRocketMqConsumer:"+f);
		try {
			if (consumerisRun) {
				return ;
			}
			mqConsumer.subscribe(topic, tag);
			mqConsumer.registerMessageListener(new MessageListenerConcurrently() {

				@Override
				public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
						ConsumeConcurrentlyContext consumeConcurrentlyContext) {
					String body = null;
					try {
						body = new String(msgs.get(0).getBody(), RemotingHelper.DEFAULT_CHARSET);
						System.out.println(String.format("rev datapackage info:%s:%s", msgs.get(0),body));
						Thread.sleep(1000*3);
						if(StringUtils.contains(body, "Hello RocketMQ 4")) {
						//	System.out.println(msgs.get(0));
							//return ConsumeConcurrentlyStatus.RECONSUME_LATER;
						}
						return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
						
						// {"packageInfoList":[{"fdfsFileId":"M00/00/01/b-W4ZF6XC6yAJdqhAAAJ6RvR4qU73.file","fdfsGroup":"group1","fileName":"00d1a36775bf4bfaaeb103c3eb77ff8c.zip","filePath":"/Users/huanggl/project/dataxfile/319/dataxfile/00d1a36775bf4bfaaeb103c3eb77ff8c.zip","packageFileHash":"51620efd364b57fbc40022407f20e0bc","packageFileSize":2248,"packageId":"00d1a36775bf4bfaaeb103c3eb77ff8c"}],"commandId":"319"}
					} catch (Exception e) {
						e.printStackTrace();
						return ConsumeConcurrentlyStatus.RECONSUME_LATER;
					}
				}
			});
			mqConsumer.start();
			consumerisRun = true;
			return ;
		} catch (Exception e) {
			e.printStackTrace();
			return ;
		}

	}

	public void stopRocketMqConsumer() {
		if (consumerisRun) {
			mqConsumer.shutdown();
			consumerisRun = false;
			return;
		}
		return ;
	}
	public static void main(String args[]) {
		
		new TestConsumer().startRocketMqConsumer("2");
	}

}
  • 消费者 有序消费消息
public class TestComsumerOrder {
	private String topic="demoTopic";//datatransferPackages
	private String tag="*";
	
	private String nameServer="111.x.x.x.x9876";
	private String groupId="packagesComsumerA";
	

	private DefaultMQPushConsumer mqConsumer;

	private volatile boolean consumerisRun = false;
	
	public TestComsumerOrder() {
		mqConsumer = new DefaultMQPushConsumer(groupId);
		mqConsumer.setNamesrvAddr(nameServer);
		mqConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
		mqConsumer.setConsumeMessageBatchMaxSize(1);
		mqConsumer.setConsumeThreadMin(5);
		mqConsumer.setConsumeThreadMax(5);
		System.out.println(mqConsumer.getConsumeThreadMax());
		
	    //consumer.setInstanceName(instanceName);
	}

	public void startRocketMqConsumer(String f) {
		System.out.println("...startRocketMqConsumer:"+f);
		try {
			if (consumerisRun) {
				return ;
			}
			mqConsumer.subscribe(topic, tag);
			mqConsumer.registerMessageListener(new MessageListenerOrderly() {
				
				@Override
				public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
					// TODO Auto-generated method stub
					String body = null;
					try {
						body = new String(msgs.get(0).getBody(), RemotingHelper.DEFAULT_CHARSET);
						System.out.println(String.format("rev datapackage info:%s:%s", msgs.get(0),body));
						Thread.sleep(1000*20);
						if(StringUtils.contains(body, "Hello RocketMQ 4")) {
						//	System.out.println(msgs.get(0));
							//return ConsumeConcurrentlyStatus.RECONSUME_LATER;
						}
						return ConsumeOrderlyStatus.SUCCESS;
						
						// {"packageInfoList":[{"fdfsFileId":"M00/00/01/b-W4ZF6XC6yAJdqhAAAJ6RvR4qU73.file","fdfsGroup":"group1","fileName":"00d1a36775bf4bfaaeb103c3eb77ff8c.zip","filePath":"/Users/huanggl/project/dataxfile/319/dataxfile/00d1a36775bf4bfaaeb103c3eb77ff8c.zip","packageFileHash":"51620efd364b57fbc40022407f20e0bc","packageFileSize":2248,"packageId":"00d1a36775bf4bfaaeb103c3eb77ff8c"}],"commandId":"319"}
					} catch (Exception e) {
						e.printStackTrace();
						return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
					}
				}
			});
			mqConsumer.start();
			consumerisRun = true;
			return ;
		} catch (Exception e) {
			e.printStackTrace();
			return ;
		}

	}

	public void stopRocketMqConsumer() {
		if (consumerisRun) {
			mqConsumer.shutdown();
			consumerisRun = false;
			return;
		}
		return ;
	}
	public static void main(String args[]) {
		
		new TestComsumerOrder().startRocketMqConsumer("1");
	}
}
  • rocketMq架构图
    在这里插入图片描述

  • 总结

  1. nameserver集群有点类似注册中心,broker与每个nameserver 长连接通信,消费者,生产者都是与nameserver中一个进行长链接获取对应broker对像
  2. broker是真正存储message的地方,如果高可用一般配置2主2从
  3. 一个消费组只能对应一个topic,一个topic可以对应多个消费组
  4. 一个topic 由多个写queue,多个读queue组成。
  5. 一个消费者可以同时对应多个queue,随着组内的消费者增加将平均分配对应queue. 如果消费者的数量大于读的queue数量,有些消费者可以获取不到数据。
  6. 消费失败的数据将返回到retryropic中
  7. 顺序消费没有重试状态,只要中断暂停状态。

https://www.cnblogs.com/xuwc/p/9034352.html

  • 常用命令

./bin/mqadmin updateTopic -t anxin -w 2 -r 2 -c DefaultCluster

rocketmq数据清理

//删除store文件夹下内容

rm -rf /usr/local/rocketmq/store/

//创建commitlog,consumequeue,index

mkdir /usr/local/rocketmq/store/commitlog
mkdir /usr/local/rocketmq/store/consumequeue
mkdir /usr/local/rocketmq/store/index

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值