rocketMq的消息的生产和消费

本文详细介绍了RocketMQ中的五种消息类型:普通消息(包括可靠的同步传输、可靠的异步传输和单项传输)、顺序消息、批量消息、延迟或定时消息及过滤消息,并提供了每种消息类型的使用场景和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、普通消息生产

        普通消息生产包括3种,可靠的同步传输、可靠的异步传输、单项传输。

       1)、可靠的同步传输

           说明:可靠的同步传输广泛应用于重要的通知消息、短信通知、短信营销系统等。

         示例代码:

         
DefaultMQProducer synProducer = new DefaultMQProducer("synProducerGroup");
synProducer.setNamesrvAddr("ip1:port;ip2:port");
synProducer.start();//启动服务
SendResult sendResult = synProducer.send(msg);//发送消息
synProducer.shutdown();//关闭资源

      2)、可靠的异步传输
          说明:可靠的异步传输通常应用于响应时间敏感的业务场景。
         示例代码:
        
DefaultMQProducer asynProducer = new DefaultMQProducer("asynProducerGroup");
asynProducer.setNamesrvAddr("ip1:port;ip2:port");
asynProducer.start();
asynProducer.send(msg, new CallSendback(){
    @Override
    public void onSuccess(SendResult sendResult){
        //消息发送成功
    }
    
    @Override
    public void onException(Trowable e){
        //消息发送异常
    }
});
asynProducer.shutdown();
       3)、单项传输
         说明:单项传输应用于中等可靠的情况下(即:对于数据可靠性要求不高),比如:日志收集。
        示例代码:       
      
DefaultMQProducer onewayProducer = new DefaultMQProducer("onewayProducerGroup");
onewayProducer.setNamesrvAddr("ip1:port;ip2:port");
onewayProducer.start();
onewayProducer.sendOneway(msg);
onewayProducer.shutdown();
  2、顺序消息
       说明:顺序消息通常应用于支付订单等对于消息顺序有严格要求的交易。
      示例代码:
    
生产者:
int orderId = 1000;//订单号

DefaultMQProducer orderProducer = new DefaultMQProducer("orderProducerGroup");
orderProducer.setNamesrvAddr("ip1:port;ip2:port");
orderProducer.start();
for(int i = 0; i < 10; i ++){
    Message msg = new Message("topic", "tags", "keys" + i, "body".getBytes(RemotingHelper.DEFAULT_CHARSET));
    orderProducer.send(msg, new MessageQueueSelector(){
    @Override
    public MessageQueue select(List mqs, Message msg, Object arg){
        Integer id = (Integer)arg;
        int index = id%mqs.size();
        return mqs.get(index);
    }
}, orderId);
}
orderProducer.shutdown();

消费者:

DefaultMQPushConsumer pushConsumer = new DefaultMQPushConsumer("pushConsumerGroup");
pushConsumer.setNamesrvAddr("ip1:port;ip2:port");
pushConsumer.subscribe("topic", "*");//订阅主题
pushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
pushCosumer.setMessageModel(MessageModel.CLUSTERING);//集群消费、默认也是“集群消费”
pushConsumer.registerMessageListener(new MessageListenerOrderly(){
    @Override
    public ConsumeOrderStatus consumeMessage(List msgs, ConsumeOrderlyContext context){
        for(int i = 0; i < msgs.size(); i ++){
            Message msg = msgs.get(i);
            System.err.println("topic:" + msg.getTopic() + ",keys:" + msg.getKeys());
        }
        return ConsumeOrderStatus.SUCCESS;
    }
});
pushConsumer.start();





3、批量消息
      示例代码:
     
DefaultMQProducer batchProducer = new DefaultMQProducer("bathProducerGroup");
batchProducer.setNamesrvAddr("ip1:port;ip2:port");
batchProducer.start();
List msgs = new ArrayList();
msgs.add(msg1);
msgs.add(msg2);
..........
batchProducer.send(msgs);
batchProducer.shutdown();

4、延迟或定时消息
      说明:rocketMq目前只支持固定精度的定时消息,
官方说法如下:
如果要支持任意的时间精度,在 Broker 层面,必须要做消息排序,如果再涉及到持久化,那么消息排序要不可避免的产生巨大性能开销。

延迟级别:
延迟级别 时间
11s
25s
310s
430s
51m
62m
73m
84m
95m
106m
117m
128m
139m
1410m
1520m
1630m
171h
182h

示例代码:
生产者:

DefaultMQProducer delayProducer = new DefaultMQProducer("delayProducerGroup");
delayProducer.setNamesrvAddr("ip1:port;ip2:port");
delayProducer.start();

Message delayMsg = new Message("topic", "tags" , "keys", "binary content");
delayMsg.setDelayTimeLevel(3);//延迟10s被消费
delayProducer.send(delayMsg);

delayProducer.shutdown();



消费者:

DefaultMQConsumer consume = new DefaultMQConsumer("consumeGroup");
consume.setNamesrvAddr("ip1:port;ip2:port");
consume.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consume.registerMessageListener(new MessageListenerConcurrently(){
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context){
        for(int i = 0; i < msgs.size(); i ++){
            Message msg = msgs.get(i);
            System.out.println("topic:" + msg.getTopic() + "keys:" + msg.getKeys());
        }
        return ConsumeConcurrentlyContext.CONSUME_SUCCESS;
    }
});


5、过滤消息
     说明:rocketMq提供了简单的消息过滤功能,仅支持一些简单的语法,

Grammars

RocketMQ only defines some basic grammars to support this feature. You could also extend it easily.

  1. Numeric comparison, like >, >=, <, <=, BETWEEN, =;
  2. Character comparison, like =, <>, IN;
  3. IS NULL or IS NOT NULL;
  4. Logical AND, OR, NOT;

Constant types are:

  1. Numeric, like 123, 3.1415;
  2. Character, like ‘abc’, must be made with single quotes;
  3. NULL, special constant;
  4. Boolean, TRUE or FALSE;

      示例代码:

   

生产者:

DefaultMQProducer producer = new DefaultMQProducer("filterGroup");
producer.setNamesrvAddr("ip1:port;ip2:port");
producer.start();

for(int i = 0; i < 10; i ++){
    Message msg = new Message("topic", "tags", "keys", "".getBytes());
    msg.putUserProperty("a", String.valueOf(i));
    producer.send(msg);
}

producer.shutdown();

消费者:

DefaultMQConsumer consumer = new DefaultMQConsumer("consumerFilterGroup");
consumer.setNamesrvAddr("ip1:port;ip2:port");
// only subsribe messages have property a, also a >=0 and a <= 3
consumer.subscribe("topic", MessageSelector.bySql("a between 1 and 5"));
consumer.registerMessageListener(new MessageListenerConcurrently(){
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context){
        
        for(int i = 0; i < msgs.size(); i ++){
            //消费
        }
        
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值