//namesrv启动
start mqnamesrv.cmd
//broker启动
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
//运行consumer java application
//运行provider java application
注:可以写两个consumer,都先启动起来(先订阅),然后生产者发送消息。你会发现,消息是按照队列有序输出的。
maven工程导包(最基本的demo只需要这4个包就可以)
<!-- RocketMQ -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-all</artifactId>
<version>4.2.0</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
生产者
package exercise1.order;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.exception.RemotingException;
public class Producer {
public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, MQBrokerException, InterruptedException {
//01new 一个默认的消息生产者
DefaultMQProducer producer = new DefaultMQProducer("ordertest");
//02注册
producer.setNamesrvAddr("localhost:9876");
//03开启
producer.start();
//04准备一份消息
for(int i=0;i<=15;i++) {
Message msg = new Message("order","tag",("order"+i).getBytes("utf-8"));
//05发送
//有序消息是在发送的时候增加一个消息队列选择器
SendResult sr = producer.send(msg,new MessageQueueSelector() {
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer)arg;
return mqs.get(id);
}
},0);
System.out.println(sr);
}
for(int i=0;i<=15;i++) {
Message msg = new Message("order","tag",("order8: "+i).getBytes("utf-8"));
//05发送
//有序消息是在发送的时候增加一个消息队列选择器
SendResult sr = producer.send(msg,new MessageQueueSelector() {
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer)arg;
return mqs.get(id);
}
},1);
System.out.println(sr);
}
for(int i=0;i<=15;i++) {
Message msg = new Message("order","tag",("order4: "+i).getBytes("utf-8"));
//05发送
//有序消息是在发送的时候增加一个消息队列选择器
SendResult sr = producer.send(msg,new MessageQueueSelector() {
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer)arg;
return mqs.get(id);
}
},3);
System.out.println(sr);
}
//06关闭
producer.shutdown();
}
}
消费者
package exercise1.order;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
public class Consumer {
public static void main(String[] args) throws MQClientException {
//01 new 默认的消息消费者
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("orderconsumer");
//02注册
consumer.setNamesrvAddr("localhost:9876");
//03设置获取原则
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//04订阅
consumer.subscribe("order","*");
//05注册监听器
consumer.registerMessageListener(new MessageListenerOrderly() {
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
//设置自动提交
context.setAutoCommit(true);
try {
System.out.println(new String(msgs.get(0).getBody(),"utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
//06启动
consumer.start();
System.out.println("接收者启动了");
}
}