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