普通消息
同步
生产者
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.client.producer.SendResult;
- import org.apache.rocketmq.client.producer.SendStatus;
- import org.apache.rocketmq.common.message.Message;
- import java.util.concurrent.TimeUnit;
- /**
- * 发送同步消息
- */
- public class SyncProducer {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 10; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("springboot-mq", "Tag1", ("Hello World" + i).getBytes());
- //5.发送消息:同步消息--此处会阻塞,一直到broker给响应
- SendResult result = producer.send(msg);
- //发送状态
- SendStatus status = result.getSendStatus();
- // mq 对某个消息产生的唯一标识
- String msgId = result.getMsgId();
- System.out.println("消息id: " + msgId);
- int queueId = result.getMessageQueue().getQueueId();
- System.out.println("该消息所在队列的id: " + queueId);
- // 发送结果:SendResult [sendStatus=SEND_OK, msgId=C0A80A11681818B4AAC21BBD81AE0000, offsetMsgId=C0A876A000002A9F00000000000FB9B4, messageQueue=MessageQueue [topic=springboot-mq, brokerName=broker-a, queueId=0], queueOffset=1]
- System.out.println("发送结果:" + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(1);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
消费者
- import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import org.apache.rocketmq.common.message.MessageExt;
- import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
- import java.util.List;
- /**
- * 消息的接受者
- */
- public class Consumer {
- public static void main(String[] args) throws Exception {
- //1.创建消费者Consumer,制定消费者组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group2");
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.订阅主题Topic和Tag,tag可以用于过滤,方法声明: void subscribe(String topic, String subExpression)
- consumer.subscribe("springboot-mq", "*");
- // 有陷阱,参考类集ConsumeFromWhere详解
- // consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
- // consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
- //4. 设定消费模式:负载均衡|广播模式
- consumer.setMessageModel(MessageModel.BROADCASTING);
- // consumer.setMessageModel(MessageModel.CLUSTERING);
- //5. 设置回调函数(监听器),处理消息
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- //接受消息内容
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- for (MessageExt msg : msgs) {
- System.out.println("consumeThread=" + Thread.currentThread().getName() + "," + new String(msg.getBody()));
- }
- // 消费结果
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- //5.启动消费者consumer
- consumer.start();
- }
- }
异步
生产者(消费者跟同步一样,主要定义的主题和tag)
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.client.producer.SendCallback;
- import org.apache.rocketmq.client.producer.SendResult;
- import org.apache.rocketmq.common.message.Message;
- import java.util.concurrent.TimeUnit;
- /**
- * 发送异步消息
- */
- public class AsyncProducer {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 10; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("base", "Tag2", ("Hello World" + i).getBytes());
- //5.发送异步消息,此处不会阻塞等broker的响应: 有一个回调
- producer.send(msg, new SendCallback() {
- /**
- * 发送成功回调函数
- * @param sendResult
- */
- public void onSuccess(SendResult sendResult) {
- // 发送结果:SendResult [sendStatus=SEND_OK, msgId=0A3A0429AED418B4AAC2118F44FF0000, offsetMsgId=C0A876A100002A9F00000000000F6DF3, messageQueue=MessageQueue [topic=base, brokerName=broker-b, queueId=0], queueOffset=0]
- System.out.println("发送结果:" + sendResult);
- }
- /**
- * 发送失败回调函数
- * @param e
- */
- public void onException(Throwable e) {
- System.out.println("发送异常:" + e);
- }
- });
- //线程睡1秒
- TimeUnit.SECONDS.sleep(1);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
单向
生产者(消费者跟同步一样,主要定义的主题和tag)
- import org.apache.rocketmq.client.exception.MQBrokerException;
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.common.message.Message;
- import java.util.concurrent.TimeUnit;
- /**
- * 发送单向消息:生产者不特别关心发送结果的场景,eg:日志发送
- */
- public class OneWayProducer {
- public static void main(String[] args) throws Exception, MQBrokerException {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 3; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("base", "Tag3", ("Hello World,单向消息" + i).getBytes());
- //5.发送单向消息,没有发送消息的结果状态,方法声明:public void sendOneway(Message msg)
- producer.sendOneway(msg);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(5);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
顺序消息
发送有序,但broker存在不同的queue里,消费者并发消费消息
全局消息顺序没有必要的,只要保证发送者张三、李四他们各自的消息是有序的即可(局部消息顺序)
如何保证?让张三的消息都扔到一个队列里面即可,消费时,每个线程独立消费一个队列
生产者(消费者跟同步一样,主要定义的主题和tag)
- 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 java.util.List;
- public class Producer {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- //构建消息集合
- List<OrderStep> orderSteps = OrderStep.buildOrders();
- //发送消息
- for (int i = 0; i < orderSteps.size(); i++) {
- String body = orderSteps.get(i) + "";
- Message message = new Message("OrderTopic", "Order", "i" + i, body.getBytes());
- /**
- * 顺序消息的关键代码
- * 参数一:消息对象
- * 参数二:消息队列的选择器
- * 参数三:选择队列的业务标识(订单ID)
- */
- SendResult sendResult = producer.send(message, new MessageQueueSelector() {
- /**
- *
- * @param mqs:消息队列集合
- * @param msg:消息对象
- * @param arg:业务标识的参数,此处就是orderSteps.get(i).getOrderId()
- * @return
- */
- @Override
- public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
- long orderId = (long) arg;
- long index = orderId % mqs.size();
- return mqs.get((int) index);
- }
- }, orderSteps.get(i).getOrderId());
- System.out.println("发送结果:" + sendResult);
- }
- producer.shutdown();
- }
- }
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 订单构建者
- */
- public class OrderStep {
- private long orderId;
- private String desc;
- public long getOrderId() {
- return orderId;
- }
- public void setOrderId(long orderId) {
- this.orderId = orderId;
- }
- public String getDesc() {
- return desc;
- }
- public void setDesc(String desc) {
- this.desc = desc;
- }
- @Override
- public String toString() {
- return "OrderStep{" +
- "orderId=" + orderId +
- ", desc='" + desc + '\'' +
- '}';
- }
- public static List<OrderStep> buildOrders() {
- // 1039L : 创建 付款 推送 完成
- // 1065L : 创建 付款
- // 7235L :创建 付款
- List<OrderStep> orderList = new ArrayList<OrderStep>();
- OrderStep orderDemo = new OrderStep();
- orderDemo.setOrderId(1039L);
- orderDemo.setDesc("创建");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(1065L);
- orderDemo.setDesc("创建");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(1039L);
- orderDemo.setDesc("付款");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(7235L);
- orderDemo.setDesc("创建");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(1065L);
- orderDemo.setDesc("付款");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(7235L);
- orderDemo.setDesc("付款");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(1065L);
- orderDemo.setDesc("完成");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(1039L);
- orderDemo.setDesc("推送");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(7235L);
- orderDemo.setDesc("完成");
- orderList.add(orderDemo);
- orderDemo = new OrderStep();
- orderDemo.setOrderId(1039L);
- orderDemo.setDesc("完成");
- orderList.add(orderDemo);
- return orderList;
- }
- }
消费者
- 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.message.MessageExt;
- import java.util.List;
- public class Consumer {
- public static void main(String[] args) throws MQClientException {
- //1.创建消费者Consumer,制定消费者组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("192.168.118.161:9876;192.168.118.160:9876");
- //3.订阅主题Topic和Tag
- consumer.subscribe("OrderTopic", "*");
- //4.注册消息监听器: 消费者特殊地方
- consumer.registerMessageListener(new MessageListenerOrderly() {
- // MessageListenerOrderly 一个队列只对应一个线程,来消费,来保证消息消费的顺序
- @Override
- public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
- for (MessageExt msg : msgs) {
- System.out.println("线程名称:【" + Thread.currentThread().getName() + "】:" + new String(msg.getBody()));
- }
- return ConsumeOrderlyStatus.SUCCESS;
- }
- });
- //5.启动消费者
- consumer.start();
- System.out.println("消费者启动");
- }
- }
延迟消息
是通过消息本身的级别来设置的,1到18级别,最多2小时
生产者
- 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.SendResult;
- import org.apache.rocketmq.client.producer.SendStatus;
- import org.apache.rocketmq.common.message.Message;
- import org.apache.rocketmq.remoting.exception.RemotingException;
- import java.util.concurrent.TimeUnit;
- public class Producer {
- public static void main(String[] args) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.161:9876;192.168.118.160:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 10; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("DelayTopic", "Tag1", ("Hello World" + i).getBytes());
- //设定延迟时间
- msg.setDelayTimeLevel(2);
- //5.发送消息
- SendResult result = producer.send(msg);
- //发送状态
- SendStatus status = result.getSendStatus();
- System.out.println("发送结果:" + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(1);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
消费者
- import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import org.apache.rocketmq.common.message.MessageExt;
- import java.util.List;
- public class Consumer {
- public static void main(String[] args) throws Exception {
- //1.创建消费者Consumer,制定消费者组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.订阅主题Topic和Tag
- consumer.subscribe("DelayTopic", "*");
- //4.设置回调函数,处理消息
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- //接受消息内容
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- for (MessageExt msg : msgs) {
- System.out.println("消息ID:【" + msg.getMsgId() + "】,延迟时间:" + (System.currentTimeMillis() - msg.getStoreTimestamp()));
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- //5.启动消费者consumer
- consumer.start();
- System.out.println("消费者启动");
- }
- }
发送批量消息
SendResult result = producer.send(msgs);发送的是消息集合,其他不变
大小限制:大于4M会消息分割即消息分割
生产者
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.client.producer.SendResult;
- import org.apache.rocketmq.client.producer.SendStatus;
- import org.apache.rocketmq.common.message.Message;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.TimeUnit;
- public class Producer {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- List<Message> msgs = new ArrayList<Message>();
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg1 = new Message("BatchTopic", "Tag1", ("Hello World" + 1).getBytes());
- Message msg2 = new Message("BatchTopic", "Tag1", ("Hello World" + 2).getBytes());
- Message msg3 = new Message("BatchTopic", "Tag1", ("Hello World" + 3).getBytes());
- msgs.add(msg1);
- msgs.add(msg2);
- msgs.add(msg3);
- //5.发送消息
- SendResult result = producer.send(msgs);
- //发送状态
- SendStatus status = result.getSendStatus();
- System.out.println("发送结果:" + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(1);
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
消费者
- import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import org.apache.rocketmq.common.message.MessageExt;
- import java.util.List;
- public class Consumer {
- public static void main(String[] args) throws Exception {
- //1.创建消费者Consumer,制定消费者组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.订阅主题Topic和Tag
- consumer.subscribe("BatchTopic", "*");
- //4.设置回调函数,处理消息
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- //接受消息内容
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- for (MessageExt msg : msgs) {
- System.out.println("consumeThread=" + Thread.currentThread().getName() + "," + new String(msg.getBody()));
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- //5.启动消费者consumer
- consumer.start();
- System.out.println("消费者启动");
- }
- }
带额外属性的消息--消息过滤sql
生产者
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.client.producer.SendResult;
- import org.apache.rocketmq.client.producer.SendStatus;
- import org.apache.rocketmq.common.message.Message;
- import java.util.concurrent.TimeUnit;
- public class Producer {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 10; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("FilterSQLTopic", "Tag1", ("Hello World" + i).getBytes());
- // 自定义一个过滤条件
- msg.putUserProperty("i", String.valueOf(i));
- //5.发送消息
- SendResult result = producer.send(msg);
- //发送状态
- SendStatus status = result.getSendStatus();
- System.out.println("发送结果:" + i + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(2);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
消费者
- import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
- import org.apache.rocketmq.client.consumer.MessageSelector;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import org.apache.rocketmq.common.message.MessageExt;
- import java.util.List;
- public class Consumer {
- public static void main(String[] args) throws Exception {
- //1.创建消费者Consumer,制定消费者组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("192.168.118.161:9876;192.168.118.160:9876");
- //3.订阅主题Topic和Tag
- consumer.subscribe("FilterSQLTopic", MessageSelector.bySql("i>5"));
- //4.设置回调函数,处理消息
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- //接受消息内容
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- for (MessageExt msg : msgs) {
- System.out.println("consumeThread=" + Thread.currentThread().getName() + "," + new String(msg.getBody()));
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- //5.启动消费者consumer
- consumer.start();
- System.out.println("消费者启动");
- }
- }
消息过滤-tag
生产者1
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.client.producer.SendResult;
- import org.apache.rocketmq.client.producer.SendStatus;
- import org.apache.rocketmq.common.message.Message;
- import java.util.concurrent.TimeUnit;
- public class Producer {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 3; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("FilterTagTopic", "Tag1", ("Hello World-Tag1" + i).getBytes());
- //5.发送消息
- SendResult result = producer.send(msg);
- //发送状态
- SendStatus status = result.getSendStatus();
- System.out.println("发送结果:" + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(1);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.client.producer.SendResult;
- import org.apache.rocketmq.client.producer.SendStatus;
- import org.apache.rocketmq.common.message.Message;
- import java.util.concurrent.TimeUnit;
- public class Producer2 {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 3; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("FilterTagTopic", "Tag2", ("Hello World-Tag2" + i).getBytes());
- //5.发送消息
- SendResult result = producer.send(msg);
- //发送状态
- SendStatus status = result.getSendStatus();
- System.out.println("发送结果:" + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(1);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
生产者2
- import org.apache.rocketmq.client.producer.DefaultMQProducer;
- import org.apache.rocketmq.client.producer.SendResult;
- import org.apache.rocketmq.client.producer.SendStatus;
- import org.apache.rocketmq.common.message.Message;
- import java.util.concurrent.TimeUnit;
- public class Producer2 {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- DefaultMQProducer producer = new DefaultMQProducer("group1");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //3.启动producer
- producer.start();
- for (int i = 0; i < 3; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("FilterTagTopic", "Tag2", ("Hello World-Tag2" + i).getBytes());
- //5.发送消息
- SendResult result = producer.send(msg);
- //发送状态
- SendStatus status = result.getSendStatus();
- System.out.println("发送结果:" + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(1);
- }
- //6.关闭生产者producer
- producer.shutdown();
- }
- }
消费者
- import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import org.apache.rocketmq.common.message.MessageExt;
- import java.util.List;
- public class Consumer {
- public static void main(String[] args) throws Exception {
- //1.创建消费者Consumer,制定消费者组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("192.168.118.161:9876;192.168.118.160:9876");
- //3.订阅主题Topic和Tag(|| 或的关系)
- consumer.subscribe("FilterTagTopic", "Tag1 || Tag2 ");
- //4.设置回调函数,处理消息
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- //接受消息内容
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- for (MessageExt msg : msgs) {
- System.out.println("consumeThread=" + Thread.currentThread().getName() + "," + new String(msg.getBody()));
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- //5.启动消费者consumer
- consumer.start();
- System.out.println("消费者启动");
- }
- }
事务消息
生产者
- import org.apache.commons.lang3.StringUtils;
- import org.apache.rocketmq.client.producer.*;
- import org.apache.rocketmq.common.message.Message;
- import org.apache.rocketmq.common.message.MessageExt;
- import java.util.concurrent.TimeUnit;
- public class Producer {
- public static void main(String[] args) throws Exception {
- //1.创建消息生产者producer,并制定生产者组名
- TransactionMQProducer producer = new TransactionMQProducer("group5");
- //2.指定Nameserver地址
- producer.setNamesrvAddr("192.168.118.160:9876;192.168.118.161:9876");
- //添加事务监听器
- producer.setTransactionListener(new TransactionListener() {
- /**
- * 在该方法中执行本地事务
- * @param msg
- * @param arg
- * @return 返回值决定了半消息是提交还是回滚,mq自己解决
- */
- @Override
- public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
- System.out.println(arg); // allen
- if (StringUtils.equals("TAGA", msg.getTags())) {
- // 提交,办消息变成可以被消息者消费的消息
- return LocalTransactionState.COMMIT_MESSAGE;
- } else if (StringUtils.equals("TAGB", msg.getTags())) {
- // 回滚半消息
- return LocalTransactionState.ROLLBACK_MESSAGE;
- } else if (StringUtils.equals("TAGC", msg.getTags())) {
- // 触发回查调用
- return LocalTransactionState.UNKNOW;
- }
- return LocalTransactionState.UNKNOW;
- }
- /**
- * 该方法时MQ进行消息事务状态回查
- * @param msg
- * @return
- */
- @Override
- public LocalTransactionState checkLocalTransaction(MessageExt msg) {
- System.out.println("回查消息的Tag:" + msg.getTags());
- return LocalTransactionState.COMMIT_MESSAGE;
- }
- });
- //3.启动producer
- producer.start();
- String[] tags = {"TAGA", "TAGB", "TAGC"};
- for (int i = 0; i < 3; i++) {
- //4.创建消息对象,指定主题Topic、Tag和消息体
- /**
- * 参数一:消息主题Topic
- * 参数二:消息Tag
- * 参数三:消息内容
- */
- Message msg = new Message("TransactionTopic", tags[i], ("Hello World" + i).getBytes());
- //5.发送消息 allen为Custom business parameter
- SendResult result = producer.sendMessageInTransaction(msg, "allen");
- //发送状态
- SendStatus status = result.getSendStatus();
- System.out.println("发送结果:" + result);
- //线程睡1秒
- TimeUnit.SECONDS.sleep(2);
- }
- //6.关闭生产者producer
- //producer.shutdown();
- }
- }
消费者(跟普通的消费者一样)
- import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
- import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
- import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
- import org.apache.rocketmq.common.message.MessageExt;
- import java.util.List;
- /**
- * 消息的消费者者
- */
- public class Consumer {
- public static void main(String[] args) throws Exception {
- //1.创建消费者Consumer,制定消费者组名
- DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group1");
- //2.指定Nameserver地址
- consumer.setNamesrvAddr("192.168.118.161:9876;192.168.118.160:9876");
- //3.订阅主题Topic和Tag
- consumer.subscribe("TransactionTopic", "*");
- //4.设置回调函数,处理消息
- consumer.registerMessageListener(new MessageListenerConcurrently() {
- //接受消息内容
- @Override
- public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
- for (MessageExt msg : msgs) {
- System.out.println("consumeThread=" + Thread.currentThread().getName() + "," + new String(msg.getBody()));
- }
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
- }
- });
- //5.启动消费者consumer
- consumer.start();
- System.out.println("消费者启动");
- }
- }